From e86f9fa5f7431398e762bf696204ab75088d8590 Mon Sep 17 00:00:00 2001 From: Vasyl Yurkovych <59879559+yurkovychv@users.noreply.github.com> Date: Tue, 7 May 2024 18:55:55 +0300 Subject: [PATCH] PMM-13086 fb tests fixes (#774) * PMM-13086 pgsm tests * PMM-13086 remove alertmanager tests as they are not part of pmm3 * PMM-13086 fix exporters and bm locations tests * PMM-13086 workflow temp update * PMM-13086 workflow temp update * PMM-13086 workflow temp update * trigger * PMM-13086 workflow temp update * PMM-13086 fix pgss * PMM-13086 fix instances and pgss\pgsm * PMM-13086 fix instances and pgss\pgsm * PMM-13086 fix profile tests * PMM-13086 user password test * PMM-13086 dont check agents on profile_test.js * PMM-13086 dont check agents on profile_test.js * PMM-13086 dont check agents on profile_test.js * PMM-13086 fix services locators * PMM-13086 skipping some tests * PMM-13086 update ci yml * PMM-13086 fix pgsm qan * trigger * PMM-13086 review fixes, fix qan for pgsm * PMM-13086 fix qan for pgsm * PMM-13086 add wait for search filter field * PMM-13086 use buildUrlWithParams for accessing QAN in PGSM tests * PMM-13086 use buildUrlWithParams for accessing QAN in PGSM tests * PMM-13086 remove only * PMM-13086 use playwright for searching for a filter in QAN * PMM-13086 use playwright for searching for a filter in QAN * PMM-13086 use playwright for searching for a filter in QAN * trigger * PMM-13086 test with old version of the pmm framework * PMM-13086 test with old version of the pmm framework * PMM-13086 test pmm framework fix * trigger * PMM-13086 use default qa-integration branch --- .github/workflows/ci.yml | 10 +- docker-compose.yml | 13 +- tests/backup/inventory_test.js | 5 +- tests/backup/locations_test.js | 1 - tests/backup/pages/locationsPage.js | 4 +- tests/backup/scheduled_test.js | 3 +- .../configuration/pages/changePasswordPage.js | 2 +- tests/configuration/pages/servicesTab.js | 9 +- tests/configuration/profile_test.js | 9 - .../configuration/verifyPMMInventory_test.js | 11 +- .../verifyPMMSettingsPageElements_test.js | 28 --- ...verifyPMMSettingsPageFunctionality_test.js | 145 ---------------- tests/custom_steps.js | 6 + .../verifyMongoDBCollectionFlags_test.js | 50 +++--- .../metrics/verifyMongoDBExperimental_test.js | 37 ++-- tests/metrics/verifyMongoDB_test.js | 14 +- tests/metrics/verifyMysqlLogLevel_test.js | 39 +++-- tests/pages/api/inventoryAPI.js | 20 ++- .../queryAnalytics/queryAnalyticsData.js | 5 +- .../queryAnalytics/queryAnalyticsFilters.js | 6 +- .../queryAnalyticsQueryDetails.js | 2 + .../pmm_pgsm_integration_test.js | 160 ++++++++++-------- .../pmm_pgss_integration_test.js | 19 ++- .../remoteInstances/remoteInstancesHelper.js | 4 +- tests/verifyRemoteInstances_test.js | 15 +- 25 files changed, 243 insertions(+), 374 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5671429d6..5686dd702 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,7 @@ on: pull_request: branches: - main + - v3 jobs: lint: @@ -23,14 +24,11 @@ jobs: e2e_fb_tests: name: e2e FB tests - uses: percona/pmm-qa/.github/workflows/fb-e2e-suite.yml@main - secrets: - BACKUP_LOCATION_ACCESS_KEY: ${{ secrets.BACKUP_LOCATION_ACCESS_KEY }} - BACKUP_LOCATION_SECRET_KEY: ${{ secrets.BACKUP_LOCATION_SECRET_KEY }} + uses: percona/pmm-qa/.github/workflows/fb-e2e-suite.yml@v3 with: sha: 'null' pmm_ui_tests_branch: ${{ github.head_ref }} - pmm_qa_branch: 'main' + pmm_qa_branch: 'v3' pmm_server_image: 'perconalab/pmm-server:3-dev-latest' pmm_client_image: 'perconalab/pmm-client:3-dev-latest' - pmm_client_version: 'dev-latest' + pmm_client_version: '3-dev-latest' diff --git a/docker-compose.yml b/docker-compose.yml index c9626a24b..cef5f02a7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,16 +21,13 @@ services: - "443:8443" environment: - PMM_DEBUG=1 - - ENABLE_RBAC=1 - - PERCONA_TEST_SAAS_HOST=check-dev.percona.com:443 + - PMM_ENABLE_ACCESS_CONTROL=1 - GF_AUTH_OAUTH_ALLOW_INSECURE_EMAIL_LOOKUP=1 - PERCONA_PORTAL_URL=https://portal-dev.percona.com - - PERCONA_TEST_CHECKS_PUBLIC_KEY=RWTg+ZmCCjt7O8eWeAmTLAqW+1ozUbpRSKSwNTmO+exlS5KEIPYWuYdX - - PERCONA_TEST_PLATFORM_ADDRESS=https://check-dev.percona.com:443 - - PERCONA_TEST_PLATFORM_PUBLIC_KEY=RWTg+ZmCCjt7O8eWeAmTLAqW+1ozUbpRSKSwNTmO+exlS5KEIPYWuYdX - - PERCONA_TEST_VERSION_SERVICE_URL=https://check-dev.percona.com/versions/v1 - - PERCONA_TEST_TELEMETRY_INTERVAL=10s - - PERCONA_TEST_TELEMETRY_RETRY_BACKOFF=10s + - PMM_DEV_PERCONA_PLATFORM_PUBLIC_KEY=RWTg+ZmCCjt7O8eWeAmTLAqW+1ozUbpRSKSwNTmO+exlS5KEIPYWuYdX + - PMM_DEV_PERCONA_PLATFORM_ADDRESS=https://check-dev.percona.com:443 + - PMM_DEV_TELEMETRY_INTERVAL=10s + - PMM_DEV_TELEMETRY_RETRY_BACKOFF=10s volumes: - pmm-server-data:/srv networks: diff --git a/tests/backup/inventory_test.js b/tests/backup/inventory_test.js index 37cf048d9..e8db55e29 100644 --- a/tests/backup/inventory_test.js +++ b/tests/backup/inventory_test.js @@ -258,8 +258,9 @@ Data(restoreFromDifferentStorageLocationsTests).Scenario( const restoreToDifferentService = new DataTable(['backupType']); -restoreToDifferentService.add(['LOGICAL']); -restoreToDifferentService.add(['PHYSICAL']); +// TODO: unskip in scope of https://perconadev.atlassian.net/browse/PMM-13097 +// restoreToDifferentService.add(['LOGICAL']); +// restoreToDifferentService.add(['PHYSICAL']); Data(restoreToDifferentService).Scenario( '@PMM-T1773 Verify user is able to perform MongoDB restore to compatible service @backup @bm-mongo @bm-fb', diff --git a/tests/backup/locations_test.js b/tests/backup/locations_test.js index b9ec1c77e..e82732f7d 100644 --- a/tests/backup/locations_test.js +++ b/tests/backup/locations_test.js @@ -13,7 +13,6 @@ const mongoServiceName = 'mongo-backup-locations'; Feature('BM: Backup Locations').retry(1); BeforeSuite(async ({ I }) => { - // await I.suppressTour(); I.say(await I.verifyCommand(`docker exec rs101 pmm-admin add mongodb --username=pmm --password=pmmpass --port=27017 --service-name=${mongoServiceName} --replication-set=rs0 --cluster=rs`)); }); diff --git a/tests/backup/pages/locationsPage.js b/tests/backup/pages/locationsPage.js index 4ce0aba8a..3a2c3623b 100644 --- a/tests/backup/pages/locationsPage.js +++ b/tests/backup/pages/locationsPage.js @@ -51,7 +51,7 @@ module.exports = { deleteByName: (name) => locate('$delete-storage-location-button').inside(locationCell(name)), showDetails: (name) => locate('$show-row-details').inside(locationCell(name)), hideDetails: (name) => locate('$hide-row-details').inside(locationCell(name)), - showSecret: locate('div').after('$small-secret-holder'), + showSecret: locate('[class$="-Icon"]').after('$small-secret-holder'), forceDeleteCheckbox: '$force-checkbox-input', cancelDelete: '$cancel-delete-modal-button', confirmDelete: '$confirm-delete-modal-button', @@ -128,7 +128,7 @@ module.exports = { verifyLocationFields(name, type, config, description = '') { const { - path, endpoint, bucket_name, access_key, secret_key, + endpoint, bucket_name, access_key, secret_key, } = config; I.waitForVisible(this.fields.name, 30); diff --git a/tests/backup/scheduled_test.js b/tests/backup/scheduled_test.js index f62cb3094..33a2285e1 100644 --- a/tests/backup/scheduled_test.js +++ b/tests/backup/scheduled_test.js @@ -352,7 +352,8 @@ Scenario( }, ); -Scenario( +// TODO: unskip after https://perconadev.atlassian.net/browse/PMM-12988 +Scenario.skip( '@PMM-T908 Verify user can enable/disable scheduled backup @backup @bm-mongo @bm-fb', async ({ I, scheduledPage, scheduledAPI, diff --git a/tests/configuration/pages/changePasswordPage.js b/tests/configuration/pages/changePasswordPage.js index d90422e31..1211a14c1 100644 --- a/tests/configuration/pages/changePasswordPage.js +++ b/tests/configuration/pages/changePasswordPage.js @@ -4,7 +4,7 @@ module.exports = { url: 'graph/profile/password', elements: { - heading: '.page-sub-heading', + heading: '[class*=page-header] h1', oldPasswordInput: '#current-password', newPasswordInput: '#new-password', confirmPasswordInput: '#confirm-new-password', diff --git a/tests/configuration/pages/servicesTab.js b/tests/configuration/pages/servicesTab.js index a78a7d55c..9036db105 100644 --- a/tests/configuration/pages/servicesTab.js +++ b/tests/configuration/pages/servicesTab.js @@ -9,21 +9,22 @@ const getServiceRowLocator = (serviceName) => `//span[contains(text(), '${servic module.exports = { url: 'graph/inventory/services', fields: { - nodesLink: locate('[role="tablist"] a').withText('Nodes').withAttr({ 'aria-label': 'Tab Nodes' }), serviceRow: (serviceName) => getServiceRowLocator(serviceName), serviceCellMonitoring: (serviceName) => `${getServiceRowLocator(serviceName)}/td[5]`, inventoryTable: locate('table'), - + }, + buttons: { + addService: locate('button').withText('Add Service'), }, pagination: paginationPart, async open() { I.amOnPage(this.url); - await I.waitForVisible(this.fields.nodesLink, 30); + I.waitForVisible(this.buttons.addService, 30); }, async getServiceMonitoringStatus(serviceName) { - await I.waitForVisible(this.fields.serviceRow(serviceName), 60); + I.waitForVisible(this.fields.serviceRow(serviceName), 60); return (await I.grabTextFrom(this.fields.serviceCellMonitoring(serviceName))).trim(); }, diff --git a/tests/configuration/profile_test.js b/tests/configuration/profile_test.js index b5cf90801..9b30a4c97 100644 --- a/tests/configuration/profile_test.js +++ b/tests/configuration/profile_test.js @@ -38,15 +38,6 @@ Scenario( process.env.ADMIN_PASSWORD = NEW_ADMIN_PASSWORD; await loginPage.login(); - await I.say('Verify all agents have "Running" status. There is no agent with "DONE" and "UNKNOWN" status'); - for (const name of ['vmagent', 'node_exporter', 'postgres_exporter', 'mongodb_exporter', 'mysqld_exporter']) { - const listStatus = (await I.verifyCommand(`pmm-admin list | grep ${name} | awk -F' ' '{print $2}' | tail -n 1`)).trim(); - const status = (await I.verifyCommand(`pmm-admin status | grep ${name} | awk -F' ' '{print $3}' | tail -n 1`)).trim(); - - I.assertEqual(listStatus, 'Running', `'${name}' is expected to have 'Running' status in pmm-admin list, but found: '${status}'`); - I.assertEqual(status, 'Running', `'${name}' is expected to have 'Running' status in pmm-admin status, but found: '${status}'`); - } - await pmmInventoryPage.servicesTab.open(); await pmmInventoryPage.servicesTab.pagination.selectRowsPerPage(100); diff --git a/tests/configuration/verifyPMMInventory_test.js b/tests/configuration/verifyPMMInventory_test.js index 8ccb6716a..4c86f1a61 100644 --- a/tests/configuration/verifyPMMInventory_test.js +++ b/tests/configuration/verifyPMMInventory_test.js @@ -1,8 +1,7 @@ const assert = require('assert'); -const { de } = require('@faker-js/faker/lib/locales'); const { - I, remoteInstancesPage, pmmInventoryPage, remoteInstancesHelper, + remoteInstancesPage, pmmInventoryPage, remoteInstancesHelper, } = inject(); const externalExporterServiceName = 'external_service_new'; @@ -250,12 +249,16 @@ Scenario( }, ); +// the test relies on --database psmdb Scenario( 'PMM-T1225 - Verify summary file includes process_exec_path for agents @inventory @exporters @cli', async ({ I, pmmInventoryPage }) => { I.amOnPage(pmmInventoryPage.url); - const response = await I.verifyCommand('pmm-admin summary'); - const statusFile = JSON.parse(await I.readFileInZipArchive(response.split(' ')[0], 'client/status.json')); + const response = await I.verifyCommand('docker exec rs101 pmm-admin summary'); + const zipFileName = response.split(' ')[0]; + + await I.verifyCommand(`docker cp rs101:/${zipFileName} ./summary.zip`); + const statusFile = JSON.parse(await I.readFileInZipArchive('summary.zip', 'client/status.json')); const exporters = statusFile.agents_info.filter((agent) => !agent.agent_type.toLowerCase().includes('qan')); I.amOnPage(pmmInventoryPage.url); diff --git a/tests/configuration/verifyPMMSettingsPageElements_test.js b/tests/configuration/verifyPMMSettingsPageElements_test.js index 776c446f1..9ed17e7d1 100644 --- a/tests/configuration/verifyPMMSettingsPageElements_test.js +++ b/tests/configuration/verifyPMMSettingsPageElements_test.js @@ -86,34 +86,6 @@ xScenario( }, ); -Scenario( - '@PMM-T1519 Verify that alerting link inside settings forwarding to correct page @settings', - async ({ I, pmmSettingsPage, alertsPage }) => { - I.amOnPage(pmmSettingsPage.alertManagerUrl); - await pmmSettingsPage.waitForPmmSettingsPageLoaded(); - I.click(pmmSettingsPage.fields.perconaAlertingUrl); - I.assertTrue((await I.grabCurrentUrl()).includes(alertsPage.url), 'Link should lead to IA page. But it does not'); - I.waitForElement(alertsPage.elements.pageHeader, 30); - }, -); - -Scenario( - '@PMM-T1820 - Verify DBaaS deprecation warning @settings @settings-fb', - async ({ - I, pmmSettingsPage, settingsAPI, dbaasPage, - }) => { - await settingsAPI.changeSettings({ dbaas: false }); - I.amOnPage(pmmSettingsPage.advancedSettingsUrl); - await pmmSettingsPage.waitForPmmSettingsPageLoaded(); - I.waitForVisible(pmmSettingsPage.fields.dbaasSwitchSelector, 30); - pmmSettingsPage.verifySwitch(pmmSettingsPage.fields.dbaasSwitchSelectorInput, 'off'); - I.click(pmmSettingsPage.fields.dbaasSwitchSelector); - I.verifyWarning('Deprecation notice\nDBaaS feature is deprecated. We encourage you to use Everest instead. Check out our Migration guide', 10); - await settingsAPI.changeSettings({ dbaas: true }); - I.amOnPage(dbaasPage.k8sClusterUrl); - I.verifyWarning('Deprecation notice\nDBaaS feature is deprecated. We encourage you to use Everest instead. Check out our Migration guide', 10); - }, -); Scenario('@PMM-T1866 - Verify if public address has an port assigned and following UI/API requests dont error @settings', async ({ I, pmmSettingsPage, adminPage }) => { I.amOnPage(pmmSettingsPage.advancedSettingsUrl); diff --git a/tests/configuration/verifyPMMSettingsPageFunctionality_test.js b/tests/configuration/verifyPMMSettingsPageFunctionality_test.js index a8b10baa0..019adfbef 100644 --- a/tests/configuration/verifyPMMSettingsPageFunctionality_test.js +++ b/tests/configuration/verifyPMMSettingsPageFunctionality_test.js @@ -1,45 +1,5 @@ -const communicationDefaults = new DataTable(['type', 'serverAddress', 'hello', 'from', 'authType', 'username', 'password', 'url', 'message']); const assert = require('assert'); -// pmmSettingsPage.communicationData.forEach(({ -// type, serverAddress, hello, from, authType, username, password, url, -// }) => { -// // eslint-disable-next-line max-len -// eslint-disable-next-line max-len -// communicationDefaults.add([type, serverAddress, hello, from, authType, username, password, url, pmmSettingsPage.messages.successPopUpMessage]); -// }); - -// communicationDefaults.add([ -// pmmSettingsPage.emailDefaults.type, -// 'test.com', -// pmmSettingsPage.emailDefaults.hello, -// pmmSettingsPage.emailDefaults.from, -// pmmSettingsPage.emailDefaults.authType, -// null, -// null, -// null, -// 'Invalid argument: invalid server address, expected format host:port']); -// communicationDefaults.add([ -// pmmSettingsPage.emailDefaults.type, -// pmmSettingsPage.emailDefaults.serverAddress, -// '%', -// pmmSettingsPage.emailDefaults.from, -// pmmSettingsPage.emailDefaults.authType, -// null, -// null, -// null, -// 'Invalid argument: invalid hello field, expected valid host']); -// communicationDefaults.add([ -// 'slack', -// null, -// null, -// null, -// null, -// null, -// null, -// 'invalid@url', -// 'Invalid argument: invalid url value']); - Feature('PMM Settings Functionality').retry(1); Before(async ({ I, settingsAPI }) => { @@ -82,34 +42,6 @@ Scenario('PMM-T94 - Open PMM Settings page and verify changing Data Retention [c I.waitForValue(pmmSettingsPage.fields.dataRetentionInput, dataRetentionValue, 30); }); -// TODO: check ovf failure -Scenario( - 'PMM-T108 - Open PMM Settings page and verify adding Alertmanager Rule [critical] PMM-T109 - Verify adding and clearing Alertmanager rules @not-ovf @settings', - async ({ I, pmmSettingsPage }) => { - const scheme = 'http://'; - const sectionNameToExpand = pmmSettingsPage.sectionTabsList.alertmanager; - - I.amOnPage(pmmSettingsPage.url); - await pmmSettingsPage.waitForPmmSettingsPageLoaded(); - await pmmSettingsPage.expandSection(sectionNameToExpand, pmmSettingsPage.fields.alertmanagerButton); - pmmSettingsPage.addAlertmanagerRule( - scheme + pmmSettingsPage.alertManager.ip + pmmSettingsPage.alertManager.service, - pmmSettingsPage.alertManager.editRule.replace('{{ sec }}', Math.floor(Math.random() * 10) + 1), - ); - I.verifyPopUpMessage(pmmSettingsPage.messages.successPopUpMessage); - pmmSettingsPage.openAlertsManagerUi(); - await pmmSettingsPage.verifyAlertmanagerRuleAdded(pmmSettingsPage.alertManager.editRuleName); - // PMM-T109 starting here - I.amOnPage(pmmSettingsPage.url); - await pmmSettingsPage.waitForPmmSettingsPageLoaded(); - await pmmSettingsPage.expandSection(sectionNameToExpand, pmmSettingsPage.fields.alertmanagerButton); - pmmSettingsPage.addAlertmanagerRule('', ''); - I.wait(5); - pmmSettingsPage.openAlertsManagerUi(); - I.dontSeeElement(`//pre[contains(text(), '${pmmSettingsPage.alertManager.editRuleName}')]`); - }, -); - Scenario.skip( 'PMM-T253 Verify user can see correct tooltip for STT [trivial] @settings @stt @grafana-pr', async ({ I, pmmSettingsPage }) => { @@ -141,49 +73,6 @@ Scenario.skip( }, ).retry(2); -Scenario('PMM-T520 - Verify that alert is in Firing State - internal alert manager @nightly @not-ovf', async ({ - I, - pmmSettingsPage, -}) => { - const scheme = 'http://127.0.0.1'; - const sectionNameToExpand = pmmSettingsPage.sectionTabsList.alertmanager; - - I.amOnPage(pmmSettingsPage.url); - await pmmSettingsPage.waitForPmmSettingsPageLoaded(); - await pmmSettingsPage.expandSection(sectionNameToExpand, pmmSettingsPage.fields.alertmanagerButton); - pmmSettingsPage.addAlertmanagerRule( - scheme + pmmSettingsPage.alertManager.service, - pmmSettingsPage.alertManager.rule2, - ); - I.verifyPopUpMessage(pmmSettingsPage.messages.successPopUpMessage); - pmmSettingsPage.openAlertsManagerUi(); - await pmmSettingsPage.verifyAlertmanagerRuleAdded(pmmSettingsPage.alertManager.ruleName2); - I.amOnPage(pmmSettingsPage.stateOfAlertsUrl); - await pmmSettingsPage.verifyAlertmanagerRuleAdded(pmmSettingsPage.alertManager.ruleName2, true); -}); - -Scenario('PMM-T520 - Verify that alert is being fired to external Alert Manager @nightly @not-ovf', async ({ - I, - pmmSettingsPage, -}) => { - const scheme = 'http://'; - const sectionNameToExpand = pmmSettingsPage.sectionTabsList.alertmanager; - - I.amOnPage(pmmSettingsPage.url); - await pmmSettingsPage.waitForPmmSettingsPageLoaded(); - await pmmSettingsPage.expandSection(sectionNameToExpand, pmmSettingsPage.fields.alertmanagerButton); - pmmSettingsPage.addAlertmanagerRule( - scheme + pmmSettingsPage.alertManager.ip + pmmSettingsPage.alertManager.externalAlertManagerPort, - pmmSettingsPage.alertManager.rule, - ); - I.verifyPopUpMessage(pmmSettingsPage.messages.successPopUpMessage); - pmmSettingsPage.openAlertsManagerUi(); - await pmmSettingsPage.verifyAlertmanagerRuleAdded(pmmSettingsPage.alertManager.ruleName); - I.amOnPage(pmmSettingsPage.stateOfAlertsUrl); - await pmmSettingsPage.verifyAlertmanagerRuleAdded(pmmSettingsPage.alertManager.ruleName, true); - await pmmSettingsPage.verifyExternalAlertManager(pmmSettingsPage.alertManager.ruleName); -}); - Scenario( 'PMM-T532 PMM-T533 PMM-T536 - Verify user can disable/enable IA in Settings @ia @settings', async ({ @@ -212,40 +101,6 @@ Scenario( }, ).retry(2); -Scenario( - 'PMM-T785 - Verify DBaaS cannot be disabled with ENABLE_DBAAS or PERCONA_TEST_DBAAS @dbaas', - async ({ I, pmmSettingsPage }) => { - I.amOnPage(pmmSettingsPage.advancedSettingsUrl); - await pmmSettingsPage.waitForPmmSettingsPageLoaded(); - I.waitForVisible(pmmSettingsPage.fields.dbaasSwitchSelector, 30); - pmmSettingsPage.verifySwitch(pmmSettingsPage.fields.dbaasSwitchSelectorInput, 'on'); - I.click(pmmSettingsPage.fields.dbaasSwitchSelector); - pmmSettingsPage.verifySwitch(pmmSettingsPage.fields.dbaasSwitchSelectorInput, 'off'); - I.click(pmmSettingsPage.fields.advancedButton); - // skipped until PMM-9982 is fixed - // pmmSettingsPage.verifySwitch(pmmSettingsPage.fields.dbaasSwitchSelectorInput, 'on'); - I.verifyPopUpMessage(pmmSettingsPage.messages.invalidDBaaSDisableMessage); - }, -); - -Data(communicationDefaults).Scenario( - 'PMM-T534 PMM-T535 PMM-T1074 - Verify user is able to set up default Email/Slack communication settings / validation @ia @settings @grafana-pr', - async ({ - I, pmmSettingsPage, settingsAPI, current, - }) => { - await settingsAPI.apiEnableIA(); - I.amOnPage(pmmSettingsPage.communicationSettingsUrl); - await pmmSettingsPage.waitForPmmSettingsPageLoaded(); - pmmSettingsPage.fillCommunicationFields(current); - I.verifyPopUpMessage(current.message); - if (current === pmmSettingsPage.messages.successPopUpMessage) { - I.refreshPage(); - await pmmSettingsPage.waitForPmmSettingsPageLoaded(); - await pmmSettingsPage.verifyCommunicationFields(current); - } - }, -); - Scenario( 'PMM-T747 - Verify enabling Azure flag @instances', async ({ diff --git a/tests/custom_steps.js b/tests/custom_steps.js index 9860a2bf2..220c4797c 100644 --- a/tests/custom_steps.js +++ b/tests/custom_steps.js @@ -162,6 +162,12 @@ module.exports = () => actor({ case 'service_name': queryParams['var-service_name'] = value; break; + case 'application_name': + queryParams['var-application_name'] = value; + break; + case 'database': + queryParams['var-database'] = value; + break; case 'columns': queryParams.columns = value; break; diff --git a/tests/metrics/verifyMongoDBCollectionFlags_test.js b/tests/metrics/verifyMongoDBCollectionFlags_test.js index ea0dfc442..c7527d500 100644 --- a/tests/metrics/verifyMongoDBCollectionFlags_test.js +++ b/tests/metrics/verifyMongoDBCollectionFlags_test.js @@ -7,11 +7,12 @@ const dbNames = ['db1', 'db2', 'db3', 'db4']; const connection = { host: '127.0.0.1', // eslint-disable-next-line no-inline-comments - port: '27027', // This is the port used by --mongo-replica-for-backup + port: '27027', // This is the port used by --database psmdb username: 'pmm', password: 'pmmpass', }; const mongodb_service_name = 'mongodb_test_collections_flag'; +const containerName = 'rs101'; const pmm_user_mongodb = { username: 'pmm', @@ -35,7 +36,7 @@ BeforeSuite(async ({ I }) => { // check that rs101 docker container exists const dockerCheck = await I.verifyCommand('docker ps | grep rs101'); - assert.ok(dockerCheck.includes('rs101'), 'rs101 docker container should exist. please run pmm-framework with --mongo-replica-for-backup'); + assert.ok(dockerCheck.includes('rs101'), 'rs101 docker container should exist. please run pmm-framework with --database psmdb'); }); Before(async ({ I }) => { @@ -43,7 +44,7 @@ Before(async ({ I }) => { }); After(async ({ I }) => { - await I.verifyCommand(`pmm-admin remove mongodb ${mongodb_service_name} || true`); + await I.verifyCommand(`docker exec ${containerName} pmm-admin remove mongodb ${mongodb_service_name} || true`); }); AfterSuite(async ({ I }) => { @@ -53,7 +54,7 @@ AfterSuite(async ({ I }) => { Scenario( 'PMM-T1860 - Verify there is no CommandNotSupportedOnView error in mongo logs when using --enable-all-collectors @dashboards @mongodb-exporter', async ({ I }) => { - const logs = await I.verifyCommand('docker exec rs101 journalctl -u mongod --since "5 minutes ago"'); + const logs = await I.verifyCommand(`docker exec ${containerName} journalctl -u mongod --since "5 minutes ago"`); assert.ok(!logs.includes('CommandNotSupportedOnView'), `"CommandNotSupportedOnView" error should not be in mongo logs. ${logs}`); @@ -64,9 +65,9 @@ Scenario( 'PMM-T1208 - Verify metrics of MongoDB added with default flags' + ' @not-ui-pipeline @mongodb-exporter @exporters', async ({ I, inventoryAPI, grafanaAPI }) => { - await I.say(await I.verifyCommand(`pmm-admin add mongodb --port=${connection.port} --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --service-name=${mongodb_service_name} --replication-set=rs0s`)); + await I.say(await I.verifyCommand(`docker exec ${containerName} pmm-admin add mongodb --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --service-name=${mongodb_service_name} --replication-set=rs0s`)); - const { service_id, listen_port } = await inventoryAPI.apiGetNodeInfoByServiceName('MONGODB_SERVICE', mongodb_service_name); + const { service_id } = await inventoryAPI.apiGetNodeInfoByServiceName('MONGODB_SERVICE', mongodb_service_name); const agentInfo = await inventoryAPI.apiGetPMMAgentInfoByServiceId(service_id); // assert dbstats and topmetrics collectors are disabled @@ -85,7 +86,7 @@ Scenario( 'PMM-T1209 - Verify metrics of MongoDB with --disable-collectors=topmetrics and --enable-all-collectors were specified' + ' @not-ui-pipeline @mongodb-exporter @exporters', async ({ I, inventoryAPI, grafanaAPI }) => { - await I.say(await I.verifyCommand(`pmm-admin add mongodb --port=${connection.port} --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --disable-collectors=topmetrics --service-name=${mongodb_service_name} --replication-set=rs0s`)); + await I.say(await I.verifyCommand(`docker exec ${containerName} pmm-admin add mongodb --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --disable-collectors=topmetrics --service-name=${mongodb_service_name} --replication-set=rs0s`)); const { service_id } = await inventoryAPI.apiGetNodeInfoByServiceName('MONGODB_SERVICE', mongodb_service_name); const agentInfo = await inventoryAPI.apiGetPMMAgentInfoByServiceId(service_id); @@ -112,7 +113,7 @@ Scenario( 'PMM-T1210 - Verify metrics of MongoDB with "--enable-all-collectors" was specified' + ' @not-ui-pipeline @mongodb-exporter @exporters', async ({ I, inventoryAPI, grafanaAPI }) => { - await I.say(await I.verifyCommand(`pmm-admin add mongodb --port=${connection.port} --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --service-name=${mongodb_service_name} --replication-set=rs0s`)); + await I.say(await I.verifyCommand(`docker exec ${containerName} pmm-admin add mongodb --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --service-name=${mongodb_service_name} --replication-set=rs0s`)); const { service_id } = await inventoryAPI.apiGetNodeInfoByServiceName('MONGODB_SERVICE', mongodb_service_name); const agentInfo = await inventoryAPI.apiGetPMMAgentInfoByServiceId(service_id); @@ -133,7 +134,7 @@ Scenario( 'PMM-T1211 - Verify metrics of MongoDB with --disable-collectors="" and --enable-all-collectors were specified' + ' @not-ui-pipeline @mongodb-exporter @exporters', async ({ I, inventoryAPI, grafanaAPI }) => { - await I.say(await I.verifyCommand(`pmm-admin add mongodb --port=${connection.port} --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --disable-collectors="" --service-name=${mongodb_service_name} --replication-set=rs0s`)); + await I.say(await I.verifyCommand(`docker exec ${containerName} pmm-admin add mongodb --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --disable-collectors="" --service-name=${mongodb_service_name} --replication-set=rs0s`)); const { service_id } = await inventoryAPI.apiGetNodeInfoByServiceName('MONGODB_SERVICE', mongodb_service_name); const agentInfo = await inventoryAPI.apiGetPMMAgentInfoByServiceId(service_id); @@ -155,7 +156,7 @@ Scenario( 'PMM-T1212 - Verify metrics of MongoDB with --disable-collectors="collstats,dbstats,topmetrics" specified' + ' @not-ui-pipeline @mongodb-exporter @exporters', async ({ I, inventoryAPI, grafanaAPI }) => { - await I.say(await I.verifyCommand(`pmm-admin add mongodb --port=${connection.port} --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --disable-collectors="collstats,dbstats,topmetrics" --service-name=${mongodb_service_name} --replication-set=rs0s`)); + await I.say(await I.verifyCommand(`docker exec ${containerName} pmm-admin add mongodb --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --disable-collectors="collstats,dbstats,topmetrics" --service-name=${mongodb_service_name} --replication-set=rs0s`)); const { service_id } = await inventoryAPI.apiGetNodeInfoByServiceName('MONGODB_SERVICE', mongodb_service_name); const agentInfo = await inventoryAPI.apiGetPMMAgentInfoByServiceId(service_id); @@ -184,7 +185,7 @@ Scenario( 'PMM-T1213 - Verify metrics of MongoDB with --stats-collections=db1,db2.col2 specified' + ' @not-ui-pipeline @mongodb-exporter @exporters', async ({ I, inventoryAPI, grafanaAPI }) => { - await I.say(await I.verifyCommand(`pmm-admin add mongodb --port=${connection.port} --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --stats-collections=db1,db2.col2 --service-name=${mongodb_service_name} --replication-set=rs0s`)); + await I.say(await I.verifyCommand(`docker exec ${containerName} pmm-admin add mongodb --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --stats-collections=db1,db2.col2 --service-name=${mongodb_service_name} --replication-set=rs0s`)); const { service_id } = await inventoryAPI.apiGetNodeInfoByServiceName('MONGODB_SERVICE', mongodb_service_name); const agentInfo = await inventoryAPI.apiGetPMMAgentInfoByServiceId(service_id); @@ -211,7 +212,7 @@ Scenario( 'PMM-T1213 - Verify metrics of MongoDB with --stats-collections=db1,db2.col2 & --max-collections-limit=5 specified when total collections across db1, db2 and the filters are 6' + ' @not-ui-pipeline @mongodb-exporter @exporters', async ({ I, inventoryAPI, grafanaAPI }) => { - await I.say(await I.verifyCommand(`pmm-admin add mongodb --port=${connection.port} --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --max-collections-limit=5 --stats-collections=db1,db2.col2 --service-name=${mongodb_service_name} --replication-set=rs0s`)); + await I.say(await I.verifyCommand(`docker exec ${containerName} pmm-admin add mongodb --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --max-collections-limit=5 --stats-collections=db1,db2.col2 --service-name=${mongodb_service_name} --replication-set=rs0s`)); const { service_id } = await inventoryAPI.apiGetNodeInfoByServiceName('MONGODB_SERVICE', mongodb_service_name); const agentInfo = await inventoryAPI.apiGetPMMAgentInfoByServiceId(service_id); @@ -238,7 +239,7 @@ Scenario( 'PMM-T1213 - Verify metrics of MongoDB with --stats-collections=db1,db2.col2 & --max-collections-limit=400 specified to allow fetching metrics from all collectors' + ' @not-ui-pipeline @mongodb-exporter @exporters', async ({ I, inventoryAPI, grafanaAPI }) => { - await I.say(await I.verifyCommand(`pmm-admin add mongodb --port=${connection.port} --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --max-collections-limit=400 --stats-collections=db1,db2.col2 --service-name=${mongodb_service_name} --replication-set=rs0s`)); + await I.say(await I.verifyCommand(`docker exec ${containerName} pmm-admin add mongodb --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --max-collections-limit=400 --stats-collections=db1,db2.col2 --service-name=${mongodb_service_name} --replication-set=rs0s`)); const { service_id } = await inventoryAPI.apiGetNodeInfoByServiceName('MONGODB_SERVICE', mongodb_service_name); const agentInfo = await inventoryAPI.apiGetPMMAgentInfoByServiceId(service_id); @@ -265,7 +266,7 @@ Scenario( 'PMM-9919 Verify smart metrics of MongoDB with --stats-collections=db1,db2.col2 & --max-collections-limit=400 specified to allow fetching metrics from all collectors' + ' @not-ui-pipeline @mongodb-exporter @exporters', async ({ I, inventoryAPI, grafanaAPI }) => { - await I.say(await I.verifyCommand(`pmm-admin add mongodb --port=${connection.port} --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --max-collections-limit=400 --stats-collections=db1,db2.col2 --service-name=${mongodb_service_name} --replication-set=rs0s`)); + await I.say(await I.verifyCommand(`docker exec ${containerName} pmm-admin add mongodb --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --max-collections-limit=400 --stats-collections=db1,db2.col2 --service-name=${mongodb_service_name} --replication-set=rs0s`)); const { service_id } = await inventoryAPI.apiGetNodeInfoByServiceName('MONGODB_SERVICE', mongodb_service_name); const agentInfo = await inventoryAPI.apiGetPMMAgentInfoByServiceId(service_id); @@ -285,10 +286,10 @@ Scenario( await grafanaAPI.checkMetricExist(smartMetricName, [{ type: 'service_name', value: mongodb_service_name }, { type: 'collector', value: 'indexstats' }]); await grafanaAPI.checkMetricExist(smartMetricName, [{ type: 'service_name', value: mongodb_service_name }, { type: 'collector', value: 'replset_status' }]); await grafanaAPI.checkMetricExist(smartMetricName, [{ type: 'service_name', value: mongodb_service_name }, { type: 'collector', value: 'top' }]); - await I.say(await I.verifyCommand(`pmm-admin remove mongodb ${mongodb_service_name}`)); + await I.say(await I.verifyCommand(`docker exec ${containerName} pmm-admin remove mongodb ${mongodb_service_name}`)); // Re-add Service with Disable Top metrics, check no smart metrics for Top - await I.say(await I.verifyCommand(`pmm-admin add mongodb --port=${connection.port} --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --disable-collectors=topmetrics --max-collections-limit=400 --stats-collections=db1,db2.col2 --service-name=${mongodb_service_name} --replication-set=rs0s`)); + await I.say(await I.verifyCommand(`docker exec ${containerName} pmm-admin add mongodb --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --disable-collectors=topmetrics --max-collections-limit=400 --stats-collections=db1,db2.col2 --service-name=${mongodb_service_name} --replication-set=rs0s`)); await I.wait(30); await grafanaAPI.checkMetricExist(smartMetricName, [{ type: 'service_name', value: `${mongodb_service_name}` }, { type: 'collector', value: 'dbstats' }]); await grafanaAPI.checkMetricAbsent(smartMetricName, [{ type: 'service_name', value: `${mongodb_service_name}` }, { type: 'collector', value: 'top' }]); @@ -299,15 +300,15 @@ Scenario( 'PMM-T1280 Verify that pmm-admin inventory add agent mongodb-exporter with --log-level flag adds MongoDB exporter with corresponding log-level' + 'PMM-T1282, PMM-T1284, PMM-T1291 Verify that pmm-admin inventory add agent node-exporter with --log-level flag adds Node exporter with corresponding log-level @not-ui-pipeline @mongodb-exporter @exporters', async ({ - I, inventoryAPI, grafanaAPI, dashboardPage, + I, inventoryAPI, dashboardPage, }) => { I.amOnPage(dashboardPage.mongoDbInstanceOverview.url); dashboardPage.waitForDashboardOpened(); // adding service which will be used to verify various inventory addition commands - await I.say(await I.verifyCommand(`pmm-admin add mongodb --port=${connection.port} --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --service-name=${mongodb_service_name}`)); + await I.say(await I.verifyCommand(`docker exec ${containerName} pmm-admin add mongodb --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --service-name=${mongodb_service_name}`)); // const { service_id } = await inventoryAPI.apiGetNodeInfoByServiceName('MONGODB_SERVICE', mongodb_service_name); - const pmm_agent_id = (await I.verifyCommand('pmm-admin status | grep "Agent ID" | awk -F " " \'{print $4}\'')).trim(); + const pmm_agent_id = (await I.verifyCommand(`docker exec ${containerName} pmm-admin status | grep "Agent ID" | awk -F " " '{print $4}'`)).trim(); const dbDetails = { username: pmm_user_mongodb.username, @@ -315,6 +316,7 @@ Scenario( pmm_agent_id, service_id, service_name: mongodb_service_name, + container_name: containerName, }; await inventoryAPI.verifyAgentLogLevel('mongodb', dbDetails); @@ -348,17 +350,17 @@ Scenario( const service_name = 'testing_force_flag'; // adding service which will be used to verify various inventory addition commands - await I.say(await I.verifyCommand(`pmm-admin add mongodb --port=${connection.port} --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --service-name=${mongodb_service_name}`)); - const pmm_agent_id = (await I.verifyCommand('pmm-admin status | grep "Agent ID" | awk -F " " \'{print $4}\'')).trim(); + await I.say(await I.verifyCommand(`docker exec ${containerName} pmm-admin add mongodb --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --service-name=${mongodb_service_name}`)); + const pmm_agent_id = (await I.verifyCommand(`docker exec ${containerName} pmm-admin status | grep "Agent ID" | awk -F " " '{print $4}'`)).trim(); // adding service which will be used to verify various inventory addition commands - await I.say(await I.verifyCommand(`pmm-admin add mongodb --port=${connection.port} --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --service-name=${service_name}`)); + await I.say(await I.verifyCommand(`docker exec ${containerName} pmm-admin add mongodb --agent-password='testing' --password=${pmm_user_mongodb.password} --username=${pmm_user_mongodb.username} --enable-all-collectors --service-name=${service_name}`)); const { service_id } = await inventoryAPI.apiGetNodeInfoByServiceName('MONGODB_SERVICE', service_name); await grafanaAPI.waitForMetric('mongodb_up', [{ type: 'service_name', value: service_name }], 90); - await I.verifyCommand(`pmm-admin inventory remove service ${service_id} --force`); + await I.verifyCommand(`docker exec ${containerName} pmm-admin inventory remove service ${service_id} --force`); await grafanaAPI.waitForMetricAbsent('mongodb_up', [{ type: 'service_name', value: service_name }], 90); // PMM-T1352 Verify that Node exporter cannot be added by pmm-admin inventory add agent node-exporter with --log-level=fatal - await I.verifyCommand(`pmm-admin inventory add agent node-exporter --log-level=fatal ${pmm_agent_id}`, 'pmm-admin: error: --log-level must be one of "debug","info","warn","error" but got "fatal"', 'fail'); + await I.verifyCommand(`docker exec ${containerName} pmm-admin inventory add agent node-exporter --log-level=fatal ${pmm_agent_id}`, 'pmm-admin: error: --log-level must be one of "debug","info","warn","error" but got "fatal"', 'fail'); }, ); diff --git a/tests/metrics/verifyMongoDBExperimental_test.js b/tests/metrics/verifyMongoDBExperimental_test.js index f9626dc64..e515565b8 100644 --- a/tests/metrics/verifyMongoDBExperimental_test.js +++ b/tests/metrics/verifyMongoDBExperimental_test.js @@ -2,13 +2,18 @@ const assert = require('assert'); Feature('MongoDB Experimental Dashboards tests'); -const mongodb_service_name_ac = 'rs101'; +let mongodb_service_name_ac; +const containerName = 'rs101'; + +BeforeSuite(async ({ I, inventoryAPI }) => { + const mongoService = await inventoryAPI.apiGetNodeInfoByServiceName('MONGODB_SERVICE', 'rs101'); + + mongodb_service_name_ac = mongoService.service_name; -BeforeSuite(async ({ I, grafanaAPI, remoteInstancesHelper }) => { // check that rs101 docker container exists - const dockerCheck = await I.verifyCommand('docker ps | grep rs101'); + const dockerCheck = await I.verifyCommand(`docker ps | grep ${containerName}`); - assert.ok(dockerCheck.includes('rs101'), 'rs101 docker container should exist. please run pmm-framework with "--mongo-replica-for-backup" flag'); + assert.ok(dockerCheck.includes(containerName), 'rs101 docker container should exist. please run pmm-framework with --database psmdb'); }); Before(async ({ I }) => { @@ -18,16 +23,12 @@ Before(async ({ I }) => { Scenario( 'PMM-T1332 - Verify MongoDB - MongoDB Collection Details @dashboards @mongodb-exporter', async ({ - I, adminPage, dashboardPage, + I, dashboardPage, }) => { I.amOnPage(I.buildUrlWithParams(dashboardPage.mongoDbCollectionDetails.clearUrl, { from: 'now-5m', service_name: mongodb_service_name_ac })); dashboardPage.waitForDashboardOpened(); - I.click(adminPage.fields.metricTitle); - adminPage.performPageDown(2); - adminPage.performPageUp(2); I.seeTextEquals('The next two graphs are available only when --enable-all-collectors option is used in pmm-admin. Graph Top 5 Collection by Documents Changed displays data only on selecting the Primary node.', locate('$TextPanel-converted-content').as('Explanation text field')); - dashboardPage.verifyMetricsExistence(dashboardPage.mongoDbCollectionDetails.metrics); - await dashboardPage.verifyThereAreNoGraphsWithNA(); + await dashboardPage.verifyMetricsExistence(dashboardPage.mongoDbCollectionDetails.metrics); await dashboardPage.verifyThereAreNoGraphsWithoutData(2); }, ); @@ -35,15 +36,11 @@ Scenario( Scenario( 'PMM-T1333 - Verify MongoDB - MongoDB Collections Overview @dashboards @mongodb-exporter', async ({ - I, adminPage, dashboardPage, + I, dashboardPage, }) => { I.amOnPage(I.buildUrlWithParams(dashboardPage.mongoDbCollectionsOverview.clearUrl, { from: 'now-5m', service_name: mongodb_service_name_ac })); dashboardPage.waitForDashboardOpened(); - I.click(adminPage.fields.metricTitle); - adminPage.performPageDown(3); - adminPage.performPageUp(3); - dashboardPage.verifyMetricsExistence(dashboardPage.mongoDbCollectionsOverview.metrics); - await dashboardPage.verifyThereAreNoGraphsWithNA(); + await dashboardPage.verifyMetricsExistence(dashboardPage.mongoDbCollectionsOverview.metrics); await dashboardPage.verifyThereAreNoGraphsWithoutData(1); }, ); @@ -51,15 +48,11 @@ Scenario( Scenario( 'PMM-T1334 - Verify MongoDB - MongoDB Oplog Details @dashboards @mongodb-exporter', async ({ - I, adminPage, dashboardPage, + I, dashboardPage, }) => { I.amOnPage(I.buildUrlWithParams(dashboardPage.mongoDbOplogDetails.clearUrl, { from: 'now-5m', service_name: mongodb_service_name_ac })); dashboardPage.waitForDashboardOpened(); - I.click(adminPage.fields.metricTitle); - adminPage.performPageDown(3); - adminPage.performPageUp(3); - dashboardPage.verifyMetricsExistence(dashboardPage.mongoDbOplogDetails.metrics); - await dashboardPage.verifyThereAreNoGraphsWithNA(); + await dashboardPage.verifyMetricsExistence(dashboardPage.mongoDbOplogDetails.metrics); await dashboardPage.verifyThereAreNoGraphsWithoutData(1); }, ); diff --git a/tests/metrics/verifyMongoDB_test.js b/tests/metrics/verifyMongoDB_test.js index 41bea6b01..f85f1cfaf 100644 --- a/tests/metrics/verifyMongoDB_test.js +++ b/tests/metrics/verifyMongoDB_test.js @@ -5,7 +5,7 @@ Feature('MongoDB Metrics tests'); const connection = { host: '127.0.0.1', // eslint-disable-next-line no-inline-comments - port: '27027', // This is the port used by --addclient=modb,1 and docker-compose setup on a CI/CD + port: '27027', // This is the port used by --database psmdb username: 'pmm', password: 'pmmpass', }; @@ -25,14 +25,16 @@ const telemetry = { replsetStatus: 'mongodb_collector_scrape_time_replset_status', }; +const containerName = 'rs101'; + BeforeSuite(async ({ I }) => { await I.mongoConnect(connection); await I.mongoAddUser(mongo_test_user.username, mongo_test_user.password); // check that rs101 docker container exists - const dockerCheck = await I.verifyCommand('docker ps | grep rs101'); + const dockerCheck = await I.verifyCommand(`docker ps | grep ${containerName}`); - assert.ok(dockerCheck.includes('rs101'), 'rs101 docker container should exist. please run pmm-framework with --mongo-replica-for-backup'); + assert.ok(dockerCheck.includes(containerName), 'rs101 docker container should exist. please run pmm-framework with --database psmdb'); }); Before(async ({ I }) => { @@ -40,7 +42,7 @@ Before(async ({ I }) => { }); After(async ({ I }) => { - await I.verifyCommand(`pmm-admin remove mongodb ${mongodb_service_name} || true`); + await I.verifyCommand(`docker exec ${containerName} pmm-admin remove mongodb ${mongodb_service_name} || true`); }); AfterSuite(async ({ I }) => { @@ -51,7 +53,7 @@ Scenario.skip( 'PMM-T1241 - Verify add mongoDB service with "+" in user password @not-ui-pipeline @mongodb-exporter @exporters', async ({ I, grafanaAPI }) => { await I.say( - await I.verifyCommand(`pmm-admin add mongodb --port=${connection.port} --password=${mongo_test_user.password} --username='${mongo_test_user.username}' --service-name=${mongodb_service_name}`), + await I.verifyCommand(`docker exec ${containerName} pmm-admin add mongodb --password=${mongo_test_user.password} --username='${mongo_test_user.username}' --service-name=${mongodb_service_name}`), ); await grafanaAPI.waitForMetric('mongodb_up', { type: 'service_name', value: mongodb_service_name }, 65); @@ -61,7 +63,7 @@ Scenario.skip( Scenario( 'PMM-T1458 - Verify MongoDB exporter meta-metrics supporting @not-ui-pipeline @mongodb-exporter @exporters', async ({ I }) => { - await I.say(await I.verifyCommand(`pmm-admin add mongodb --port=${connection.port} --password=${connection.password} --username=${connection.username} --service-name=${mongodb_service_name} --enable-all-collectors`)); + await I.say(await I.verifyCommand(`docker exec ${containerName} pmm-admin add mongodb --password=${connection.password} --username=${connection.username} --service-name=${mongodb_service_name} --enable-all-collectors`)); let logs = ''; await I.asyncWaitFor(async () => { diff --git a/tests/metrics/verifyMysqlLogLevel_test.js b/tests/metrics/verifyMysqlLogLevel_test.js index 90d127d1d..deb820bf6 100644 --- a/tests/metrics/verifyMysqlLogLevel_test.js +++ b/tests/metrics/verifyMysqlLogLevel_test.js @@ -1,22 +1,27 @@ const assert = require('assert'); -const faker = require('faker'); - -const { adminPage } = inject(); Feature('Integration tests for Mysql Exporter PMM Agent and Log Level'); -const pmmFrameworkLoader = `bash ${adminPage.pathToFramework}`; const connection = { - // eslint-disable-next-line no-inline-comments - port: '3307', // This is the port used by --setup-pmm-ps-integration --pmm2 --query-source=slowlog --ps-version=8.0 - container_name: 'ps_pmm_8.0', + // The port is generated by --database ps,QUERY_SOURCE=slowlog and will be assigned in BeforeSuite + port: '', + // The container_name is generated by --database ps,QUERY_SOURCE=slowlog and will be assigned in BeforeSuite + container_name: '', username: 'msandbox', password: 'msandbox', }; const mysql_service_name_ac = 'mysql_service'; -BeforeSuite(async ({ I, grafanaAPI }) => { - await I.verifyCommand(`${pmmFrameworkLoader} --setup-pmm-ps-integration --pmm2 --query-source=slowlog --ps-version=8.0`); +BeforeSuite(async ({ I, inventoryAPI }) => { + const psService = await inventoryAPI.apiGetNodeInfoByServiceName('MYSQL_SERVICE', 'ps-'); + + connection.port = psService.port; + + // check that ps_pmm docker container exists + const dockerCheck = await I.verifyCommand('docker ps | grep ps_pmm | awk \'{print $NF}\''); + + assert.ok(dockerCheck.includes('ps_pmm'), 'ps docker container should exist. please run pmm-framework with --database ps,QUERY_SOURCE=slowlog'); + connection.container_name = dockerCheck.trim(); }); Before(async ({ I }) => { @@ -30,7 +35,7 @@ After(async ({ I }) => { Scenario( 'PMM-T1307 PMM-T1306 PMM-T1305 PMM-T1304 PMM-T1290 PMM-T1281 Verify that pmm-admin inventory add agent mysqld-exporter with --log-level flag adds MySQL exporter with corresponding log-level @not-ui-pipeline @exporters', async ({ - I, inventoryAPI, grafanaAPI, dashboardPage, + I, inventoryAPI, dashboardPage, }) => { I.amOnPage(dashboardPage.mysqlInstanceSummaryDashboard.url); dashboardPage.waitForDashboardOpened(); @@ -71,7 +76,7 @@ Scenario( Scenario( 'PMM-T1351 PMM-T1350 Verify that MySQL exporter cannot be added by pmm-admin add mysql with --log-level=fatal @not-ui-pipeline @exporters', async ({ - I, inventoryAPI, grafanaAPI, dashboardPage, + I, inventoryAPI, dashboardPage, }) => { I.amOnPage(dashboardPage.mysqlInstanceSummaryDashboard.url); dashboardPage.waitForDashboardOpened(); @@ -105,14 +110,14 @@ Scenario( async ({ I, pmmInventoryPage }) => { I.amOnPage(pmmInventoryPage.url); // Find node ID - const nodeId = (await I.verifyCommand(`docker exec ${connection.container_name} ls /usr/local/percona/pmm2/tmp/node_exporter/agent_id/`)).trim(); + const nodeId = (await I.verifyCommand(`docker exec ${connection.container_name} ls /usr/local/percona/pmm/tmp/node_exporter/agent_id/`)).trim(); // Verify and find ids of node exporter let processIds = await I.verifyCommand(`docker exec ${connection.container_name} pgrep node_exporter`); const processId = processIds.split(/(\s+)/); - await I.verifyCommand(`docker exec ${connection.container_name} rm /usr/local/percona/pmm2/tmp/node_exporter/agent_id/${nodeId}/webConfigPlaceholder`); - const nodeFolder2 = await I.verifyCommand(`docker exec ${connection.container_name} ls /usr/local/percona/pmm2/tmp/node_exporter/agent_id/${nodeId}/`); + await I.verifyCommand(`docker exec ${connection.container_name} rm /usr/local/percona/pmm/tmp/node_exporter/agent_id/${nodeId}/webConfigPlaceholder`); + const nodeFolder2 = await I.verifyCommand(`docker exec ${connection.container_name} ls /usr/local/percona/pmm/tmp/node_exporter/agent_id/${nodeId}/`); assert.ok(nodeFolder2.length === 0, 'folder webConfigPlaceholder was not removed.'); @@ -129,12 +134,12 @@ Scenario( assert.ok(nodeExporterRestart.length, 'Node exporter is not restarted'); - const folderRestart = await I.verifyCommand(`docker exec ${connection.container_name} ls /usr/local/percona/pmm2/tmp/node_exporter/agent_id/${nodeId}/`); + const folderRestart = await I.verifyCommand(`docker exec ${connection.container_name} ls /usr/local/percona/pmm/tmp/node_exporter/agent_id/${nodeId}/`); assert.ok(folderRestart.includes('webConfigPlaceholder'), 'webConfigPlaceholder was not recreated after restart'); // remove node exporter folder - await I.verifyCommand(`docker exec ${connection.container_name} rm -r /usr/local/percona/pmm2/tmp/node_exporter/`); + await I.verifyCommand(`docker exec ${connection.container_name} rm -r /usr/local/percona/pmm/tmp/node_exporter/`); let restartProcessId = nodeExporterRestart.split(/(\s+)/); await I.verifyCommand(`docker exec ${connection.container_name} kill -9 ${restartProcessId[0]}`); @@ -149,7 +154,7 @@ Scenario( const nodeExporterRemoved = await I.verifyCommand(`docker exec ${connection.container_name} pgrep node_exporter`); assert.ok(nodeExporterRemoved.length, 'Node exporter is not restarted'); - const folderRemoveNodeExporter = await I.verifyCommand(`docker exec ${connection.container_name} ls /usr/local/percona/pmm2/tmp/node_exporter/agent_id/${nodeId}/`); + const folderRemoveNodeExporter = await I.verifyCommand(`docker exec ${connection.container_name} ls /usr/local/percona/pmm/tmp/node_exporter/agent_id/${nodeId}/`); assert.ok(folderRemoveNodeExporter.includes('webConfigPlaceholder'), 'webConfigPlaceholder was not recreated after restart'); }, diff --git a/tests/pages/api/inventoryAPI.js b/tests/pages/api/inventoryAPI.js index 2fc43217f..64a97b331 100644 --- a/tests/pages/api/inventoryAPI.js +++ b/tests/pages/api/inventoryAPI.js @@ -227,27 +227,27 @@ module.exports = { switch (agentType) { case 'mongodb': - agent_id = (await I.verifyCommand(`pmm-admin inventory add agent mongodb-exporter --password=${dbDetails.password} --push-metrics ${logLvlFlag} ${dbDetails.pmm_agent_id} ${dbDetails.service_id} ${dbDetails.username} | grep "Agent ID" | grep -v "PMM-Agent ID" | awk -F " " '{print $4}'`)).trim(); + agent_id = (await I.verifyCommand(`docker exec ${dbDetails.container_name} pmm-admin inventory add agent mongodb-exporter --password=${dbDetails.password} --push-metrics ${logLvlFlag} ${dbDetails.pmm_agent_id} ${dbDetails.service_id} ${dbDetails.username} | grep "Agent ID" | grep -v "PMM-Agent ID" | awk -F " " '{print $4}'`)).trim(); output = await this.apiGetAgentDetailsViaAgentId(agent_id); log_level = output.data.mongodb_exporter.log_level; await grafanaAPI.waitForMetric('mongodb_up', [{ type: 'agent_id', value: agent_id }], 90); I.assertEqual(log_level, logLevel || 'warn', `Was expecting Mongo Exporter for service ${dbDetails.service_name} added again via inventory command and log level to have ${logLevel || 'warn'} set`); break; case 'node': - agent_id = (await I.verifyCommand(`pmm-admin inventory add agent node-exporter --push-metrics ${logLvlFlag} ${dbDetails.pmm_agent_id} | grep "Agent ID" | grep -v "PMM-Agent ID" | awk -F " " '{print $4}'`)).trim(); + agent_id = (await I.verifyCommand(`docker exec ${dbDetails.container_name} pmm-admin inventory add agent node-exporter --push-metrics ${logLvlFlag} ${dbDetails.pmm_agent_id} | grep "Agent ID" | grep -v "PMM-Agent ID" | awk -F " " '{print $4}'`)).trim(); output = await this.apiGetAgentDetailsViaAgentId(agent_id); log_level = output.data.node_exporter.log_level; await grafanaAPI.waitForMetric('node_memory_MemTotal_bytes', [{ type: 'agent_id', value: agent_id }], 90); assert.ok(log_level === logLevel || 'warn', `Was expecting Node Exporter for service ${dbDetails.service_name} added again via inventory command and log level to have ${logLevel || 'warn'} set`); break; case 'mongodb_profiler': - agent_id = (await I.verifyCommand(`pmm-admin inventory add agent qan-mongodb-profiler-agent --password=${dbDetails.password} ${logLvlFlag} ${dbDetails.pmm_agent_id} ${dbDetails.service_id} ${dbDetails.username} | grep "Agent ID" | grep -v "PMM-Agent ID" | awk -F " " '{print $4}'`)).trim(); + agent_id = (await I.verifyCommand(`docker exec ${dbDetails.container_name} pmm-admin inventory add agent qan-mongodb-profiler-agent --password=${dbDetails.password} ${logLvlFlag} ${dbDetails.pmm_agent_id} ${dbDetails.service_id} ${dbDetails.username} | grep "Agent ID" | grep -v "PMM-Agent ID" | awk -F " " '{print $4}'`)).trim(); output = await this.apiGetAgentDetailsViaAgentId(agent_id); log_level = output.data.qan_mongodb_profiler_agent.log_level; // Wait for Status to change to running I.wait(10); - await I.verifyCommand(`pmm-admin list | grep mongodb_profiler_agent | grep ${agent_id} | grep ${dbDetails.service_id} | grep "Running"`); + await I.verifyCommand(`docker exec ${dbDetails.container_name} pmm-admin list | grep mongodb_profiler_agent | grep ${agent_id} | grep ${dbDetails.service_id} | grep "Running"`); assert.ok(log_level === logLevel || 'warn', `Was expecting MongoDB QAN Profile for service ${dbDetails.service_name} added again via inventory command and log level to have ${logLevel || 'warn'} set`); break; case 'postgresql': @@ -292,9 +292,19 @@ module.exports = { break; case 'qan-slowlog': agent_id = (await I.verifyCommand(`docker exec ${dbDetails.container_name} pmm-admin inventory add agent qan-mysql-slowlog-agent --password=${dbDetails.password} ${logLvlFlag} ${dbDetails.pmm_agent_id} ${dbDetails.service_id} ${dbDetails.username} | grep "Agent ID" | grep -v "PMM-Agent ID" | awk -F " " '{print $4}'`)).trim(); - output = await this.apiGetAgentDetailsViaAgentId(agent_id); + + await I.asyncWaitFor(async () => { + output = await this.apiGetAgentDetailsViaAgentId(agent_id); + const { status } = output.data.qan_mysql_slowlog_agent; + + return status === 'RUNNING'; + }, 20); + log_level = output.data.qan_mysql_slowlog_agent.log_level; + I.say(JSON.stringify(output.data, null, 2)); + I.say(await I.verifyCommand(`docker exec ${dbDetails.container_name} pmm-admin list | grep mysql_slowlog_agent | grep ${agent_id} | grep ${dbDetails.service_id}`)); + // Wait for Status to change to running I.wait(10); await I.verifyCommand(`docker exec ${dbDetails.container_name} pmm-admin list | grep mysql_slowlog_agent | grep ${agent_id} | grep ${dbDetails.service_id} | grep "Running"`); diff --git a/tests/pages/components/queryAnalytics/queryAnalyticsData.js b/tests/pages/components/queryAnalytics/queryAnalyticsData.js index a68933e8e..9d0f35779 100644 --- a/tests/pages/components/queryAnalytics/queryAnalyticsData.js +++ b/tests/pages/components/queryAnalytics/queryAnalyticsData.js @@ -82,10 +82,11 @@ class QueryAnalyticsData { assert.ok(count === expectedRowCount, `Row count should be ${expectedRowCount} instead of ${count}`); } - async getRowCount(rowCount) { + async getRowCount() { I.waitForVisible(this.elements.queryRows, 30); - return await I.grabNumberOfVisibleElements(this.elements.queryRows); + // Subtract 1 because it includes TOTAL + return (await I.grabNumberOfVisibleElements(this.elements.queryRows)) - 1; } async verifyPagesAndCount(itemsPerPage) { diff --git a/tests/pages/components/queryAnalytics/queryAnalyticsFilters.js b/tests/pages/components/queryAnalytics/queryAnalyticsFilters.js index a17b8b6bd..dea47b00e 100644 --- a/tests/pages/components/queryAnalytics/queryAnalyticsFilters.js +++ b/tests/pages/components/queryAnalytics/queryAnalyticsFilters.js @@ -55,10 +55,11 @@ class QueryAnalyticsFilters { selectFilter(filterName) { I.waitForVisible(this.fields.filterBy, 30); - I.fillField(this.fields.filterBy, filterName); - I.usePlaywrightTo('Select QAN Filter', async ({ page }) => { + I.usePlaywrightTo('Search and select QAN Filter', async ({ page }) => { const locator = await page.locator(this.fields.filterByExactName(filterName).value); + await page.locator(this.fields.filterBy.value).fill(filterName); + await locator.waitFor({ state: 'attached' }); await locator.click(); }); @@ -84,6 +85,7 @@ class QueryAnalyticsFilters { selectedFilter = ''; } + I.waitForVisible(this.fields.filterBy, 10); I.fillField(this.fields.filterBy, filterName); I.usePlaywrightTo('Select QAN Filter', async ({ page }) => { const locator = await page.locator(this.fields.filterByNameAndGroup(selectedFilter, groupName).value); diff --git a/tests/pages/components/queryAnalytics/queryAnalyticsQueryDetails.js b/tests/pages/components/queryAnalytics/queryAnalyticsQueryDetails.js index c0522c0dd..1f0342cfe 100644 --- a/tests/pages/components/queryAnalytics/queryAnalyticsQueryDetails.js +++ b/tests/pages/components/queryAnalytics/queryAnalyticsQueryDetails.js @@ -11,6 +11,8 @@ class QueryAnalyticsQueryDetails { noClassic: locate('pre').withText('No classic explain found'), noJSON: locate('pre').withText('No JSON explain found'), explainError: locate('$json-explain-error'), + histogramContainer: locate('$histogram-collapse-container'), + topQuery: locate('$top-query').find('div'), }; this.buttons = { tab: (tabName) => locate('button').withText(tabName), diff --git a/tests/qa-integration/pmm_pgsm_integration_test.js b/tests/qa-integration/pmm_pgsm_integration_test.js index d3c614072..2505418d4 100644 --- a/tests/qa-integration/pmm_pgsm_integration_test.js +++ b/tests/qa-integration/pmm_pgsm_integration_test.js @@ -2,7 +2,7 @@ const assert = require('assert'); const connection = { host: '127.0.0.1', - port: 5437, + port: 5447, user: 'postgres', password: 'pass+this', database: 'postgres', @@ -13,12 +13,11 @@ const connection = { // Service Name: ${PGSQL_PGSM_CONTAINER}_${PGSQL_VERSION}_service // Docker Container Name: ${PGSQL_PGSM_CONTAINER}_${PGSQL_VERSION} -const version = process.env.PGSQL_VERSION ? `${process.env.PGSQL_VERSION}` : '14'; -const container = process.env.PGSQL_PGSM_CONTAINER ? `${process.env.PGSQL_PGSM_CONTAINER}` : 'pgsql_pgsm'; +const version = process.env.PDPGSQL_VERSION ? `${process.env.PDPGSQL_VERSION}` : '16'; const database = `pgsm${Math.floor(Math.random() * 99) + 1}`; -const pgsm_service_name = `${container}_${version}_service`; -const pgsm_service_name_socket = `socket_${container}_${version}_service`; -const container_name = `${container}_${version}`; +let pgsm_service_name; +let pgsm_service_name_socket; +let container_name; const percentageDiff = (a, b) => (a - b === 0 ? 0 : 100 * Math.abs((a - b) / b)); const labels = [ @@ -38,6 +37,20 @@ filters.add(['Database', database]); Feature('PMM + PGSM Integration Scenarios'); +BeforeSuite(async ({ I, inventoryAPI }) => { + const pgsm_service = await inventoryAPI.apiGetNodeInfoByServiceName('POSTGRESQL_SERVICE', 'pdpgsql_'); + const socket_service = await inventoryAPI.apiGetNodeInfoByServiceName('POSTGRESQL_SERVICE', 'socket_pdpgsql_'); + + pgsm_service_name = pgsm_service.service_name; + pgsm_service_name_socket = socket_service.service_name; + + // check that pdpgsql docker container exists + const dockerCheck = await I.verifyCommand('docker ps | grep pdpgsql_ | awk \'{print $NF}\''); + + assert.ok(dockerCheck.includes('pdpgsql_'), 'pdpgsql docker container should exist. please run pmm-framework with --database pdpgsql'); + container_name = dockerCheck.trim(); +}); + Before(async ({ I }) => { await I.Authorize(); }); @@ -181,55 +194,55 @@ Scenario( Data(filters).Scenario( 'PMM-T1261 - Verify the "Command type" filter for Postgres @not-ui-pipeline @pgsm-pmm-integration', async ({ - I, qanPage, qanOverview, qanFilters, current, + I, queryAnalyticsPage, current, }) => { const serviceName = pgsm_service_name; const { filterSection, filterToApply, } = current; - I.amOnPage(qanPage.url); - qanOverview.waitForOverviewLoaded(); - await qanFilters.applyFilter(serviceName); - await qanFilters.applyFilter(database); - I.waitForVisible(qanFilters.buttons.showSelected, 30); + I.amOnPage(queryAnalyticsPage.url); + queryAnalyticsPage.waitForLoaded(); + queryAnalyticsPage.filters.selectContainFilter(serviceName); + queryAnalyticsPage.filters.selectContainFilter(database); + I.waitForVisible(queryAnalyticsPage.filters.buttons.showSelected, 30); - await qanFilters.applyFilterInSection(filterSection, filterToApply); + queryAnalyticsPage.filters.selectFilterInGroup(filterToApply, filterSection); }, ); Scenario( 'PMM-T1262 - Verify Postgresql Dashboard Instance Summary has Data @not-ui-pipeline @pgsm-pmm-integration', - async ({ - I, dashboardPage, adminPage, - }) => { - I.amOnPage(dashboardPage.postgresqlInstanceSummaryDashboard.url); + async ({ I, dashboardPage }) => { + const url = I.buildUrlWithParams( + dashboardPage.postgresqlInstanceSummaryDashboard.cleanUrl, { + service_name: pgsm_service_name, + from: 'now-5m', + }, + ); + + I.amOnPage(url); dashboardPage.waitForDashboardOpened(); - await dashboardPage.applyFilter('Service Name', pgsm_service_name); await dashboardPage.expandEachDashboardRow(); - I.click(adminPage.fields.metricTitle); - adminPage.performPageDown(5); - adminPage.performPageUp(5); - dashboardPage.verifyMetricsExistence(dashboardPage.postgresqlInstanceSummaryDashboard.metrics); - await dashboardPage.verifyThereAreNoGraphsWithNA(); + await dashboardPage.verifyMetricsExistence(dashboardPage.postgresqlInstanceSummaryDashboard.metrics); await dashboardPage.verifyThereAreNoGraphsWithoutData(1); }, ); Scenario( - 'PMM-T2261 - Verify Postgresql Dashboard Instance Summary has Data with socket based service and Agent log @not-ui-pipeline @pgsm-pmm-integration', - async ({ - I, dashboardPage, adminPage, - }) => { - I.amOnPage(dashboardPage.postgresqlInstanceSummaryDashboard.url); + 'Verify Postgresql Dashboard Instance Summary has Data with socket based service and Agent log @not-ui-pipeline @pgsm-pmm-integration', + async ({ I, dashboardPage }) => { + const url = I.buildUrlWithParams( + dashboardPage.postgresqlInstanceSummaryDashboard.cleanUrl, { + service_name: pgsm_service_name_socket, + from: 'now-5m', + }, + ); + + I.amOnPage(url); dashboardPage.waitForDashboardOpened(); - await dashboardPage.applyFilter('Service Name', pgsm_service_name_socket); await dashboardPage.expandEachDashboardRow(); - I.click(adminPage.fields.metricTitle); - adminPage.performPageDown(5); - adminPage.performPageUp(5); - dashboardPage.verifyMetricsExistence(dashboardPage.postgresqlInstanceSummaryDashboard.metrics); - await dashboardPage.verifyThereAreNoGraphsWithNA(); + await dashboardPage.verifyMetricsExistence(dashboardPage.postgresqlInstanceSummaryDashboard.metrics); await dashboardPage.verifyThereAreNoGraphsWithoutData(1); const log = await I.verifyCommand(`docker exec ${container_name} cat pmm-agent.log`); @@ -367,9 +380,7 @@ Scenario( Scenario( 'PMM-T1063 - Verify Application Name with pg_stat_monitor @pgsm-pmm-integration @not-ui-pipeline', - async ({ - I, qanOverview, qanFilters, qanPage, - }) => { + async ({ I, queryAnalyticsPage }) => { await I.verifyCommand('docker exec pmm-server clickhouse-client --database pmm --query "TRUNCATE TABLE metrics"'); await I.pgExecuteQueryOnDemand('SELECT pg_stat_monitor_reset();', connection); @@ -381,13 +392,20 @@ Scenario( await I.pgExecuteQueryOnDemand(sql, connection); I.wait(120); await I.verifyCommand(`docker exec ${container_name} pmm-admin list | grep "postgresql_pgstatmonitor_agent" | grep "Running"`); - I.amOnPage(qanPage.url); - qanOverview.waitForOverviewLoaded(); - I.waitForVisible(qanFilters.buttons.showSelected, 30); - await qanFilters.applyFilterInSection('Application Name', applicationName); - qanOverview.waitForOverviewLoaded(); - const count = await qanOverview.getCountOfItems(); + const url = I.buildUrlWithParams(queryAnalyticsPage.url, { + // application_name: applicationName, + from: 'now-5m', + }); + + I.amOnPage(url); + queryAnalyticsPage.waitForLoaded(); + queryAnalyticsPage.filters.selectFilter(applicationName); + I.wait(5); + I.waitForVisible(queryAnalyticsPage.filters.buttons.showSelected, 30); + queryAnalyticsPage.waitForLoaded(); + + const count = await queryAnalyticsPage.data.getRowCount(); assert.ok(parseInt(count, 10) === 5, `Expected only 5 Queries to show up for ${applicationName} based on the load script but found ${count}`); }, @@ -395,9 +413,7 @@ Scenario( Scenario( 'PMM-T1063 - Verify Top Query and Top QueryID with pg_stat_monitor @pgsm-pmm-integration @not-ui-pipeline', - async ({ - I, qanOverview, qanFilters, qanPage, qanDetails, - }) => { + async ({ I, queryAnalyticsPage }) => { let pgsm_output; const db = `${database}_topquery`; const queryWithTopId = '(select $1 + $2)'; @@ -431,17 +447,20 @@ Scenario( const pgsmTopQuery = pgsm_output.rows[i].top_query; const pgsmQuery = pgsm_output.rows[i].query; - I.amOnPage(qanPage.url); - qanOverview.waitForOverviewLoaded(); - I.waitForVisible(qanFilters.buttons.showSelected, 30); + const url = I.buildUrlWithParams(queryAnalyticsPage.url, { + database: db, + from: 'now-5m', + }); + + I.amOnPage(url); + queryAnalyticsPage.waitForLoaded(); + + queryAnalyticsPage.data.searchByValue(queryId); + queryAnalyticsPage.waitForLoaded(); + queryAnalyticsPage.data.selectRow(1); + + I.waitForElement(queryAnalyticsPage.queryDetails.elements.topQuery); - await qanFilters.applyFilterInSection('Database', db); - qanOverview.waitForOverviewLoaded(); - await qanOverview.searchByValue(queryId); - qanOverview.waitForOverviewLoaded(); - qanOverview.selectRow(1); - I.waitForElement(qanDetails.elements.topQuery); - I.click(qanDetails.elements.topQuery); // qanOverview.waitForOverviewLoaded(); // const queryid = await I.grabValueFrom(qanOverview.fields.searchBy); // @@ -455,9 +474,7 @@ Scenario( Scenario( 'PMM-T1071 - Verify Histogram is displayed for each query with pg_stat_monitor @pgsm-pmm-integration @not-ui-pipeline', - async ({ - I, qanOverview, qanFilters, qanPage, qanDetails, - }) => { + async ({ I, queryAnalyticsPage }) => { let countHistogram = 0; const db = `${database}_histogram`; @@ -477,19 +494,22 @@ Scenario( await I.pgExecuteQueryOnDemand(sql, connection); connection.database = 'postgres'; I.wait(120); - I.amOnPage(qanPage.url); - qanOverview.waitForOverviewLoaded(); - I.waitForVisible(qanFilters.buttons.showSelected, 30); - await qanFilters.applyFilterInSection('Database', db); - qanOverview.waitForOverviewLoaded(); - const count = await qanOverview.getCountOfItems(); + const url = I.buildUrlWithParams(queryAnalyticsPage.url, { + database: db, + from: 'now-5m', + }); + + I.amOnPage(url); + queryAnalyticsPage.waitForLoaded(); + + const count = await queryAnalyticsPage.data.getRowCount(); - // Skipping the first one because thats the top query generated by select pg_sleep() + // Skipping the first one because that's the top query generated by select pg_sleep() for (let i = 2; i <= count; i++) { - qanOverview.selectRow(i); - I.waitForElement(qanDetails.buttons.close, 30); - const count = await I.grabNumberOfVisibleElements(qanDetails.elements.histogramContainer); + queryAnalyticsPage.data.selectRow(i); + I.waitForElement(queryAnalyticsPage.queryDetails.buttons.close, 30); + const count = await I.grabNumberOfVisibleElements(queryAnalyticsPage.queryDetails.elements.histogramContainer); countHistogram += count; } @@ -560,7 +580,7 @@ xScenario( Scenario( 'PMM-T1292 PMM-T1302 PMM-T1303 PMM-T1283 Verify that pmm-admin inventory add agent postgres-exporter with --log-level flag adds PostgreSQL exporter with corresponding log-level @not-ui-pipeline @pgsm-pmm-integration', async ({ - I, inventoryAPI, grafanaAPI, dashboardPage, + I, inventoryAPI, dashboardPage, }) => { I.amOnPage(dashboardPage.postgresqlInstanceOverviewDashboard.url); dashboardPage.waitForDashboardOpened(); diff --git a/tests/qa-integration/pmm_pgss_integration_test.js b/tests/qa-integration/pmm_pgss_integration_test.js index bcdbc4aae..97dee6dbc 100644 --- a/tests/qa-integration/pmm_pgss_integration_test.js +++ b/tests/qa-integration/pmm_pgss_integration_test.js @@ -14,21 +14,28 @@ const connection = { // Service Name: ${PGSQL_PGSS_CONTAINER}_${PGSQL_VERSION}_service // Docker Container Name: ${PGSQL_PGSS_CONTAINER}_${PGSQL_VERSION} -const version = process.env.PGSQL_VERSION ? `${process.env.PGSQL_VERSION}` : '14'; -const container = process.env.PGSQL_PGSS_CONTAINER ? `${process.env.PGSQL_PGSS_CONTAINER}` : 'pgsql_pgss'; +const version = process.env.PGSQL_VERSION ? `${process.env.PGSQL_VERSION}` : '16'; +const container = process.env.PGSQL_PGSS_CONTAINER ? `${process.env.PGSQL_PGSS_CONTAINER}` : 'pgsql_pgss_pmm'; const database = `pgss${Math.floor(Math.random() * 99) + 1}`; -const pgss_service_name = `${container}_${version}_service`; +let pgss_service_name; const container_name = `${container}_${version}`; const pmmFrameworkLoader = `bash ${adminPage.pathToFramework}`; const pgsqlVersionPgss = new DataTable(['pgsqlVersion', 'expectedPgssVersion', 'expectedColumnName']); -pgsqlVersionPgss.add([12, '1.7', 'total_time']); -pgsqlVersionPgss.add([13, '1.8', 'total_exec_time']); +// TODO: unskip when pmm-framework takes port parameter https://perconadev.atlassian.net/browse/PMM-13096 +// pgsqlVersionPgss.add([12, '1.7', 'total_time']); +// pgsqlVersionPgss.add([13, '1.8', 'total_exec_time']); const labels = [{ key: 'database', value: [`${database}`] }]; Feature('PMM + pgss Integration Scenarios'); +BeforeSuite(async ({ inventoryAPI }) => { + const pgss_service = await inventoryAPI.apiGetNodeInfoByServiceName('POSTGRESQL_SERVICE', 'pgsql_'); + + pgss_service_name = pgss_service.service_name; +}); + Before(async ({ I }) => { await I.Authorize(); }); @@ -202,8 +209,6 @@ Data(pgsqlVersionPgss).Scenario( const exposedPort = '5444'; const serviceName = `pgsql_pgss_${pgsqlVersion}_service`; - await I.say(`admin password is: ${process.env.ADMIN_PASSWORD}`); - await I.say(`${pmmFrameworkLoader} --pmm2 --setup-pmm-pgss-integration --pgsql-version=${pgsqlVersion} --pgsql-pgss-port=${exposedPort}`); await I.verifyCommand(`export ADMIN_PASSWORD=${process.env.ADMIN_PASSWORD}`); diff --git a/tests/remoteInstances/remoteInstancesHelper.js b/tests/remoteInstances/remoteInstancesHelper.js index 98ce1a9d8..b814bde8e 100644 --- a/tests/remoteInstances/remoteInstancesHelper.js +++ b/tests/remoteInstances/remoteInstancesHelper.js @@ -193,14 +193,14 @@ module.exports = { }, haproxy: { haproxy_2: { - host: (PMM_SERVER_OVF_AMI_SETUP === 'true' ? EXTERNAL_EXPORTER_HOST : 'HAPROXY'), + host: (PMM_SERVER_OVF_AMI_SETUP === 'true' ? EXTERNAL_EXPORTER_HOST : 'haproxy_pmm'), port: '42100', clusterName: 'haproxy_clst', }, }, external: { redis: { - host: (PMM_SERVER_OVF_AMI_SETUP === 'true' ? EXTERNAL_EXPORTER_HOST : '192.168.0.1'), + host: (PMM_SERVER_OVF_AMI_SETUP === 'true' ? EXTERNAL_EXPORTER_HOST : 'external_pmm'), port: '42200', clusterName: 'redis_external_exporter', environment: 'redis_external', diff --git a/tests/verifyRemoteInstances_test.js b/tests/verifyRemoteInstances_test.js index 969a4cd1b..ab0ce038e 100644 --- a/tests/verifyRemoteInstances_test.js +++ b/tests/verifyRemoteInstances_test.js @@ -287,13 +287,16 @@ Data(dashboardCheck).Scenario( Data(qanFilters).Scenario( 'PMM-T854 - Verify QAN after remote instance is added @instances @instances-fb', async ({ - I, qanOverview, qanFilters, qanPage, current, + I, queryAnalyticsPage, current, }) => { - I.amOnPage(qanPage.url); - qanOverview.waitForOverviewLoaded(); - await qanFilters.applyFilter(current.filterName); - qanOverview.waitForOverviewLoaded(); - const count = await qanOverview.getCountOfItems(); + const url = I.buildUrlWithParams(queryAnalyticsPage.url, { + environment: current.filterName, + from: 'now-5m', + }); + + I.amOnPage(url); + queryAnalyticsPage.waitForLoaded(); + const count = await queryAnalyticsPage.data.getCountOfItems(); assert.ok(count > 0, `The queries for filter ${current.filterName} instance do NOT exist`); },