diff --git a/tests/configuration/pages/pmmInventoryPage.js b/tests/configuration/pages/pmmInventoryPage.js index af06be86c..6cf9ae4cb 100644 --- a/tests/configuration/pages/pmmInventoryPage.js +++ b/tests/configuration/pages/pmmInventoryPage.js @@ -1,30 +1,41 @@ -const { I, inventoryAPI } = inject(); +const { + I, inventoryAPI, remoteInstancesHelper, adminPage, +} = inject(); + const assert = require('assert'); const paginationPart = require('./paginationFragment'); const servicesTab = require('./servicesTab'); +const service = (serviceName) => `//span[contains(text(),'${serviceName}')]`; + module.exports = { url: 'graph/inventory?orgId=1', fields: { servicesLink: locate('[role="tablist"] a').withText('Services').withAttr({ 'aria-label': 'Tab Services' }), serviceRow: (serviceName) => locate('tr').withChild(locate('td').withAttr({ title: serviceName })), - showServiceDetails: (serviceName) => `//span[contains(text(), '${serviceName}')]//ancestor::tr//button[@data-testid="show-row-details"]`, - hideServiceDetails: (serviceName) => `//span[contains(text(), '${serviceName}')]//ancestor::tr//button[@data-testid="hide-row-details"]`, + showServiceDetails: (serviceName) => `${service(serviceName)}//ancestor::tr//button[@data-testid="show-row-details"]`, + hideServiceDetails: (serviceName) => `${service(serviceName)}//ancestor::tr//button[@data-testid="hide-row-details"]`, showAgentDetails: (agentName) => `//td[contains(text(), '${agentName}')]//ancestor::tr//button[@data-testid="show-row-details"]`, showRowDetails: '//button[@data-testid="show-row-details"]', agentStatus: locate('$details-row-content').find('a'), backToServices: '//span[text()="Go back to services"]', agentsLinkNew: '//div[contains(@data-testid,"status-badge")]', + detailsLabelByText: (label) => locate('[aria-label="Tags"]').find('li').withText(label), agentDetailsLabelByText: (label) => locate('[aria-label="Tags"]').find('li').withText(label), agentsLink: locate('[role="tablist"] a').withText('Agents').withAttr({ 'aria-label': 'Tab Agents' }), agentsLinkOld: locate('a').withText('Agents'), + cluster: '$cluster-text-input', deleteButton: locate('span').withText('Delete'), + environment: '$environment-text-input', externalExporter: locate('td').withText('External exporter'), + editButton: locate('span').withText('Edit'), + editText: locate('h3').withText('Editing'), forceModeCheckbox: locate('$force-field-label'), inventoryTable: locate('table'), inventoryTableColumn: locate('table').find('td'), inventoryTableRows: locate('tr').after('table'), inventoryTableRowCount: (count) => locate('span').withText(`${count}`), + kebabMenu: (serviceName) => `${service(serviceName)}//ancestor::tr//button[@data-testid="dropdown-menu-toggle"]`, mongoServiceName: locate('td').withText('mongodb'), mysqlServiceName: locate('td').withText('ms-single'), // cannot be changed to locate because it's failing in I.waitForVisible() @@ -50,7 +61,11 @@ module.exports = { selectAllCheckbox: locate('$select-all'), selectRowCheckbox: locate('$select-row'), removalDialogMessage: '//form/h4', + replicationSet: '$replication_set-text-input', selectedCheckbox: '//div[descendant::input[@value="true"] and @data-testid="select-row"]', + saveButton: locate('button').withChild('div').withText('Save Changes'), + saveConfirmButton: locate('span').withText('Confirm and save changes'), + savePopupMessage: locate('p').withText('Changing existing labels can affect other parts of PMM dependent on it'), }, servicesTab, pagination: paginationPart, @@ -373,4 +388,37 @@ module.exports = { await I.waitForVisible(agent, 30); I.click(this.fields.backToServices); }, + + async saveAndConfirm() { + I.click(this.fields.saveButton); + I.seeElement(this.fields.savePopupMessage); + I.click(this.fields.saveConfirmButton); + }, + + openEditServiceWizard(serviceName) { + I.waitForElement(this.fields.kebabMenu(serviceName), 30); + I.click(this.fields.kebabMenu(serviceName)); + I.waitForElement(this.fields.editButton, 30); + I.click(this.fields.editButton); + I.waitForElement(this.fields.editText, 30); + I.seeElement(this.fields.editText); + }, + + updateServiceLabels(serviceParameters) { + I.usePlaywrightTo('clear fields', async ({ page }) => { + await page.fill(I.useDataQA('environment-text-input'), serviceParameters.environment); + await page.fill(I.useDataQA('replication_set-text-input'), serviceParameters.replicationSet); + await page.fill(I.useDataQA('cluster-text-input'), serviceParameters.cluster); + }); + + this.saveAndConfirm(); + }, + + verifyServiceLabels(serviceParameters) { + // Verify new values for labels in details + I.waitForVisible(this.fields.detailsLabelByText(`environment=${serviceParameters.environment}`), 20); + I.seeElement(this.fields.detailsLabelByText(`environment=${serviceParameters.environment}`)); + I.seeElement(this.fields.detailsLabelByText(`cluster=${serviceParameters.cluster}`)); + I.seeElement(this.fields.detailsLabelByText(`replication_set=${serviceParameters.replicationSet}`)); + }, }; diff --git a/tests/configuration/verifyPMMInventory_test.js b/tests/configuration/verifyPMMInventory_test.js index 4e99b6b69..04992d4b8 100644 --- a/tests/configuration/verifyPMMInventory_test.js +++ b/tests/configuration/verifyPMMInventory_test.js @@ -1,4 +1,66 @@ const assert = require('assert'); +const {de} = require("@faker-js/faker/lib/locales"); + +const { + I, remoteInstancesPage, pmmInventoryPage, remoteInstancesHelper, +} = inject(); + +const externalExporterServiceName = 'external_service_new'; +const haproxyServiceName = 'haproxy_remote'; + +const instances = new DataTable(['name']); +const qanFilters = new DataTable(['filterName']); + +for (const [key, value] of Object.entries(remoteInstancesHelper.services)) { + if (value) { + switch (key) { + case 'postgresql': + // TODO: https://jira.percona.com/browse/PMM-9011 + // qanFilters.add([remoteInstancesPage.potgresqlSettings.environment]); + break; + case 'mysql': + qanFilters.add([remoteInstancesPage.mysqlSettings.environment]); + break; + case 'postgresGC': + qanFilters.add([remoteInstancesPage.postgresGCSettings.environment]); + break; + case 'mongodb': + qanFilters.add([remoteInstancesPage.mongodbSettings.environment]); + break; + case 'proxysql': + break; + default: + } + instances.add([key]); + } +} + +const azureServices = new DataTable(['name', 'instanceToMonitor']); + +if (remoteInstancesHelper.getInstanceStatus('azure').azure_mysql.enabled) { + azureServices.add(['azure-MySQL', 'pmm2-qa-mysql']); + qanFilters.add([remoteInstancesPage.mysqlAzureInputs.environment]); +} + +if (remoteInstancesHelper.getInstanceStatus('azure').azure_postgresql.enabled) { + azureServices.add(['azure-PostgreSQL', 'pmm2-qa-postgresql']); + qanFilters.add([remoteInstancesPage.postgresqlAzureInputs.environment]); +} + +const aws_instances = new DataTable(['service_name', 'password', 'instance_id', 'cluster_name']); + +aws_instances.add([ + remoteInstancesHelper.remote_instance.aws.aurora.aurora2.address, + remoteInstancesHelper.remote_instance.aws.aurora.aurora2.password, + remoteInstancesHelper.remote_instance.aws.aurora.aurora2.instance_id, + remoteInstancesHelper.remote_instance.aws.aurora.aurora2.cluster_name, +]); +aws_instances.add([ + remoteInstancesHelper.remote_instance.aws.aurora.aurora3.address, + remoteInstancesHelper.remote_instance.aws.aurora.aurora3.password, + remoteInstancesHelper.remote_instance.aws.aurora.aurora3.instance_id, + remoteInstancesHelper.remote_instance.aws.aurora.aurora3.cluster_name, +]); Feature('Inventory page'); @@ -208,3 +270,252 @@ Scenario( }); }, ); + +Data(instances).Scenario( + 'PMM-T2340 - Verify Remote Instances can be created and edited [critical] @inventory @inventory-fb', + async ({ + I, pmmInventoryPage, current, + }) => { + const serviceName = remoteInstancesHelper.services[current.name]; + + I.amOnPage(remoteInstancesPage.url); + remoteInstancesPage.waitUntilRemoteInstancesPageLoaded(); + remoteInstancesPage.openAddRemotePage(current.name); + const inputs = await remoteInstancesPage.fillRemoteFields(serviceName); + + remoteInstancesPage.createRemoteInstance(serviceName); + pmmInventoryPage.verifyRemoteServiceIsDisplayed(serviceName); + + const newLabels = { + environment: `${inputs.environment} edited` || `${serviceName} environment edited`, + cluster: `${inputs.cluster} edited` || `${serviceName} cluster edited`, + replicationSet: `${inputs.replicationSet} edited` || `${serviceName} replicationSet edited`, + }; + + pmmInventoryPage.openEditServiceWizard(serviceName); + pmmInventoryPage.updateServiceLabels(newLabels); + I.click(pmmInventoryPage.fields.showServiceDetails(serviceName)); + pmmInventoryPage.verifyServiceLabels(newLabels); + }, +); + +Scenario( + 'PMM-T2340 - Verify adding and editing external exporter service via UI @inventory @inventory-fb', + async ({ I, remoteInstancesPage, pmmInventoryPage }) => { + I.amOnPage(remoteInstancesPage.url); + remoteInstancesPage.waitUntilRemoteInstancesPageLoaded(); + remoteInstancesPage.openAddRemotePage('external'); + const inputs =await remoteInstancesPage.fillRemoteFields(externalExporterServiceName); + I.waitForVisible(remoteInstancesPage.fields.addService, 30); + I.click(remoteInstancesPage.fields.addService); + pmmInventoryPage.verifyRemoteServiceIsDisplayed(externalExporterServiceName); + const newLabels = { + environment: `${inputs.environment} edited` || `${externalExporterServiceName} environment edited`, + cluster: `${inputs.cluster} edited` || `${externalExporterServiceName} cluster edited`, + replicationSet: `${inputs.replicationSet} edited` || `${externalExporterServiceName} replicationSet edited`, + }; + + pmmInventoryPage.openEditServiceWizard(externalExporterServiceName); + pmmInventoryPage.updateServiceLabels(newLabels); + I.click(pmmInventoryPage.fields.showServiceDetails(externalExporterServiceName)); + pmmInventoryPage.verifyServiceLabels(newLabels); + }, +).retry(0); + +Scenario( + 'PMM-T2340 - Verify adding and editing RDS instances [critical] @inventory @inventory-fb', + async ({ I, remoteInstancesPage, pmmInventoryPage }) => { + const serviceName = remoteInstancesPage.mysql57rds['Service Name']; + + I.amOnPage(remoteInstancesPage.url); + remoteInstancesPage.waitUntilRemoteInstancesPageLoaded().openAddAWSRDSMySQLPage(); + remoteInstancesPage.discoverRDS(); + remoteInstancesPage.verifyInstanceIsDiscovered(serviceName); + remoteInstancesPage.startMonitoringOfInstance(serviceName); + remoteInstancesPage.verifyAddInstancePageOpened(); + const inputs = await remoteInstancesPage.fillRemoteRDSFields(serviceName); + remoteInstancesPage.createRemoteInstance(serviceName); + pmmInventoryPage.verifyRemoteServiceIsDisplayed(serviceName); + const newLabels = { + environment: `${inputs.environment} edited` || `${serviceName} environment edited`, + cluster: `${inputs.cluster} edited` || `${serviceName} cluster edited`, + replicationSet: `${inputs.replicationSet} edited` || `${serviceName} replicationSet edited`, + }; + + pmmInventoryPage.openEditServiceWizard(serviceName); + pmmInventoryPage.updateServiceLabels(newLabels); + I.click(pmmInventoryPage.fields.showServiceDetails(serviceName)); + pmmInventoryPage.verifyServiceLabels(newLabels); + }, +); + +Scenario( + '@PMM-T2340 - Verify Adding and Editing HAProxy service via UI @inventory @inventory-fb', + async ({ + I, remoteInstancesPage, pmmInventoryPage, + }) => { + I.amOnPage(remoteInstancesPage.url); + remoteInstancesPage.waitUntilRemoteInstancesPageLoaded(); + remoteInstancesPage.openAddRemotePage('haproxy'); + I.waitForVisible(remoteInstancesPage.fields.hostName, 30); + I.fillField( + remoteInstancesPage.fields.hostName, + remoteInstancesHelper.remote_instance.haproxy.haproxy_2.host, + ); + I.fillField(remoteInstancesPage.fields.serviceName, haproxyServiceName); + I.clearField(remoteInstancesPage.fields.portNumber); + I.fillField( + remoteInstancesPage.fields.portNumber, + remoteInstancesHelper.remote_instance.haproxy.haproxy_2.port, + ); + I.scrollPageToBottom(); + I.waitForVisible(remoteInstancesPage.fields.addService, 30); + I.click(remoteInstancesPage.fields.addService); + pmmInventoryPage.verifyRemoteServiceIsDisplayed(haproxyServiceName); + const newLabels = { + environment: `${remoteInstancesHelper.remote_instance.haproxy.environment} edited` || `${haproxyServiceName} environment edited`, + cluster: `${remoteInstancesHelper.remote_instance.haproxy.clusterName} edited` || `${haproxyServiceName} cluster edited`, + replicationSet: `${remoteInstancesHelper.remote_instance.haproxy.replicationSet} edited` || `${haproxyServiceName} replicationSet edited`, + }; + + pmmInventoryPage.openEditServiceWizard(haproxyServiceName); + pmmInventoryPage.updateServiceLabels(newLabels); + I.click(pmmInventoryPage.fields.showServiceDetails(haproxyServiceName)); + pmmInventoryPage.verifyServiceLabels(newLabels); + }, +); + +Scenario( + 'PMM-T2340 - Verify adding and editing PostgreSQL RDS monitoring to PMM via UI @inventory @inventory-fb', + async ({ + I, remoteInstancesPage, pmmInventoryPage, + }) => { + const serviceName = 'pmm-qa-pgsql-12'; + + I.amOnPage(remoteInstancesPage.url); + remoteInstancesPage.waitUntilRemoteInstancesPageLoaded().openAddAWSRDSMySQLPage(); + remoteInstancesPage.discoverRDS(); + remoteInstancesPage.verifyInstanceIsDiscovered(serviceName); + remoteInstancesPage.startMonitoringOfInstance(serviceName); + remoteInstancesPage.verifyAddInstancePageOpened(); + const grabbedHostname = await I.grabValueFrom(remoteInstancesPage.fields.hostName); + + assert.ok(grabbedHostname.startsWith(serviceName), `Hostname is incorrect: ${grabbedHostname}`); + I.seeInField(remoteInstancesPage.fields.serviceName, serviceName); + const inputs = await remoteInstancesPage.fillRemoteRDSFields(serviceName); + remoteInstancesPage.createRemoteInstance(serviceName); + pmmInventoryPage.verifyRemoteServiceIsDisplayed(serviceName); + const newLabels = { + environment: `${inputs.environment} edited` || `${serviceName} environment edited`, + cluster: `${inputs.cluster} edited` || `${serviceName} cluster edited`, + replicationSet: `${inputs.replicationSet} edited` || `${serviceName} replicationSet edited`, + }; + pmmInventoryPage.openEditServiceWizard(serviceName); + pmmInventoryPage.updateServiceLabels(newLabels); + I.click(pmmInventoryPage.fields.showServiceDetails(serviceName)); + pmmInventoryPage.verifyServiceLabels(newLabels); + }, +); + +Data(azureServices).Scenario( + 'PMM-T2340 - Verify adding and editing monitoring for Azure @inventory @inventory-fb', + async ({ + I, remoteInstancesPage, pmmInventoryPage, settingsAPI, current, + }) => { + const serviceName = current.name; + + await settingsAPI.enableAzure(); + I.amOnPage(remoteInstancesPage.url); + remoteInstancesPage.openAddAzure(); + remoteInstancesPage.discoverAzure(); + remoteInstancesPage.startMonitoringOfInstance(current.instanceToMonitor); + remoteInstancesPage.verifyAddInstancePageOpened(); + const inputs = await remoteInstancesPage.fillRemoteRDSFields(serviceName); + I.click(remoteInstancesPage.fields.addService); + pmmInventoryPage.verifyRemoteServiceIsDisplayed(serviceName); + const newLabels = { + environment: `${inputs.environment} edited` || `${serviceName} environment edited`, + cluster: `${inputs.cluster} edited` || `${serviceName} cluster edited`, + replicationSet: `${inputs.replicationSet} edited` || `${serviceName} replicationSet edited`, + }; + + pmmInventoryPage.openEditServiceWizard(serviceName); + pmmInventoryPage.updateServiceLabels(newLabels); + I.click(pmmInventoryPage.fields.showServiceDetails(serviceName)); + pmmInventoryPage.verifyServiceLabels(newLabels); + }, +); + +Data(aws_instances).Scenario('PMM-T2340 Verify adding and editing Aurora remote instance @inventory @inventory-fb', async ({ + I, addInstanceAPI, current, +}) => { + const { + service_name, password, instance_id, cluster_name, + } = current; + + const details = { + add_node: { + node_name: service_name, + node_type: 'REMOTE_NODE', + }, + aws_access_key: remoteInstancesHelper.remote_instance.aws.aurora.aws_access_key, + aws_secret_key: remoteInstancesHelper.remote_instance.aws.aurora.aws_secret_key, + address: service_name, + service_name: instance_id, + port: remoteInstancesHelper.remote_instance.aws.aurora.port, + username: remoteInstancesHelper.remote_instance.aws.aurora.username, + password, + instance_id, + cluster: cluster_name, + }; + + await addInstanceAPI.addRDS(details.service_name, details); + + I.amOnPage(pmmInventoryPage.url); + pmmInventoryPage.verifyRemoteServiceIsDisplayed(details.service_name); + const newLabels = { + environment: `${details.environment} edited` || `${details.service_name} environment edited`, + cluster: `${details.cluster} edited` || `${details.service_name} cluster edited`, + replicationSet: `${details.replicationSet} edited` || `${details.service_name} replicationSet edited`, + }; + + pmmInventoryPage.openEditServiceWizard(details.service_name); + pmmInventoryPage.updateServiceLabels(newLabels); + I.click(pmmInventoryPage.fields.showServiceDetails(details.service_name)); + pmmInventoryPage.verifyServiceLabels(newLabels); +}); + +Data(qanFilters).Scenario( + 'PMM-T2340 - Verify QAN after remote instance is added @inventory @inventory-fb', + async ({ + I, qanOverview, qanFilters, qanPage, current, + }) => { + I.amOnPage(qanPage.url); + qanOverview.waitForOverviewLoaded(); + await qanFilters.applyFilter(current.filterName); + qanOverview.waitForOverviewLoaded(); + const count = await qanOverview.getCountOfItems(); + + assert.ok(count > 0, `The queries for filter ${current.filterName} instance do NOT exist`); + }, +).retry(2); + +Data(aws_instances).Scenario( + 'PMM-T2340 Verify QAN after Aurora instance is added and eidted @inventory @inventory-fb', + async ({ + I, qanOverview, qanFilters, qanPage, current, adminPage, + }) => { + const { instance_id } = current; + + I.amOnPage(qanPage.url); + qanOverview.waitForOverviewLoaded(); + await adminPage.applyTimeRange('Last 12 hours'); + qanOverview.waitForOverviewLoaded(); + qanFilters.waitForFiltersToLoad(); + await qanFilters.applySpecificFilter(instance_id); + qanOverview.waitForOverviewLoaded(); + const count = await qanOverview.getCountOfItems(); + + assert.ok(count > 0, `The queries for service ${instance_id} instance do NOT exist, check QAN Data`); + }, +).retry(1); diff --git a/tests/pages/remoteInstancesPage.js b/tests/pages/remoteInstancesPage.js index d09251889..ce249e885 100644 --- a/tests/pages/remoteInstancesPage.js +++ b/tests/pages/remoteInstancesPage.js @@ -23,6 +23,11 @@ module.exports = { environment: 'remote-postgres', cluster: 'remote-postgres-cluster', }, + mongodbSettings: { + environment: 'remote-mongodb', + cluster: 'remote-mongodb-cluster', + replicationSet: 'remote-mongodb-replica', + }, postgresqlAzureInputs: { userName: remoteInstancesHelper.remote_instance.azure.azure_postgresql.userName, password: remoteInstancesHelper.remote_instance.azure.azure_postgresql.password, @@ -279,32 +284,39 @@ module.exports = { }, async fillRemoteFields(serviceName) { + let inputs; + // eslint-disable-next-line default-case switch (serviceName) { case remoteInstancesHelper.services.mysql: - I.fillField(this.fields.hostName, remoteInstancesHelper.remote_instance.mysql.ps_5_7.host); - I.fillField(this.fields.userName, remoteInstancesHelper.remote_instance.mysql.ps_5_7.username); - I.fillField(this.fields.password, remoteInstancesHelper.remote_instance.mysql.ps_5_7.password); + inputs = { + ...remoteInstancesHelper.remote_instance.mysql.ps_5_7, + ...this.mysqlSettings, + }; + I.fillField(this.fields.hostName, inputs.host); + I.fillField(this.fields.userName, inputs.username); + I.fillField(this.fields.password, inputs.password); adminPage.customClearField(this.fields.portNumber); - I.fillField(this.fields.portNumber, remoteInstancesHelper.remote_instance.mysql.ps_5_7.port); + I.fillField(this.fields.portNumber, inputs.port); I.fillField(this.fields.serviceName, serviceName); - I.fillField(this.fields.environment, this.mysqlSettings.environment); - I.fillField(this.fields.cluster, this.mysqlSettings.cluster); + I.fillField(this.fields.environment, inputs.environment); + I.fillField(this.fields.cluster, inputs.cluster); break; case remoteInstancesHelper.services.mysql_ssl: - I.fillField(this.fields.hostName, remoteInstancesHelper.remote_instance.mysql.ms_8_0_ssl.host); - I.fillField(this.fields.userName, remoteInstancesHelper.remote_instance.mysql.ms_8_0_ssl.username); - I.fillField(this.fields.password, remoteInstancesHelper.remote_instance.mysql.ms_8_0_ssl.password); + inputs = remoteInstancesHelper.remote_instance.mysql.ms_8_0_ssl; + I.fillField(this.fields.hostName, inputs.host); + I.fillField(this.fields.userName, inputs.username); + I.fillField(this.fields.password, inputs.password); adminPage.customClearField(this.fields.portNumber); - I.fillField(this.fields.portNumber, remoteInstancesHelper.remote_instance.mysql.ms_8_0_ssl.port); + I.fillField(this.fields.portNumber, inputs.port); I.fillField(this.fields.serviceName, serviceName); I.fillField( this.fields.environment, - remoteInstancesHelper.remote_instance.mysql.ms_8_0_ssl.environment, + inputs.environment, ); I.fillField( this.fields.cluster, - remoteInstancesHelper.remote_instance.mysql.ms_8_0_ssl.clusterName, + inputs.clusterName, ); I.dontSeeElement(this.fields.tlscaInput); I.dontSeeElement(this.fields.tlsCertificateInput); @@ -313,40 +325,45 @@ module.exports = { I.waitForElement(this.fields.tlscaInput, 30); await this.fillFileContent( this.fields.tlscaInput, - remoteInstancesHelper.remote_instance.mysql.ms_8_0_ssl.tlsCAFile, + inputs.tlsCAFile, ); await this.fillFileContent( this.fields.tlsCertificateInput, - remoteInstancesHelper.remote_instance.mysql.ms_8_0_ssl.tlsCertificateFile, + inputs.tlsCertificateFile, ); await this.fillFileContent( this.fields.tlsCertificateKeyInput, - remoteInstancesHelper.remote_instance.mysql.ms_8_0_ssl.tlsCertificateKeyFile, + inputs.tlsCertificateKeyFile, ); break; case remoteInstancesHelper.services.mongodb: - I.fillField(this.fields.hostName, remoteInstancesHelper.remote_instance.mongodb.psmdb_4_2.host); - I.fillField(this.fields.userName, remoteInstancesHelper.remote_instance.mongodb.psmdb_4_2.username); - I.fillField(this.fields.password, remoteInstancesHelper.remote_instance.mongodb.psmdb_4_2.password); + inputs = { + ...remoteInstancesHelper.remote_instance.mongodb.psmdb_4_2, + ...this.mongodbSettings, + }; + I.fillField(this.fields.hostName, inputs.host); + I.fillField(this.fields.userName, inputs.username); + I.fillField(this.fields.password, inputs.password); I.fillField(this.fields.serviceName, serviceName); - I.fillField(this.fields.environment, 'remote-mongodb'); - I.fillField(this.fields.cluster, 'remote-mongodb-cluster'); + I.fillField(this.fields.environment, inputs.environment); + I.fillField(this.fields.cluster, inputs.cluster); break; case remoteInstancesHelper.services.mongodb_ssl: - I.fillField(this.fields.hostName, remoteInstancesHelper.remote_instance.mongodb.mongodb_4_4_ssl.host); + inputs = remoteInstancesHelper.remote_instance.mongodb.mongodb_4_4_ssl; + I.fillField(this.fields.hostName, inputs.host); adminPage.customClearField(this.fields.portNumber); I.fillField( this.fields.portNumber, - remoteInstancesHelper.remote_instance.mongodb.mongodb_4_4_ssl.port, + inputs.port, ); I.fillField(this.fields.serviceName, serviceName); I.fillField( this.fields.environment, - remoteInstancesHelper.remote_instance.mongodb.mongodb_4_4_ssl.environment, + inputs.environment, ); I.fillField( this.fields.cluster, - remoteInstancesHelper.remote_instance.mongodb.mongodb_4_4_ssl.clusterName, + inputs.clusterName, ); I.dontSeeElement(this.fields.tlscaInput); I.dontSeeElement(this.fields.tlsCertificateFilePasswordInput); @@ -355,29 +372,33 @@ module.exports = { I.waitForElement(this.fields.tlscaInput, 30); await this.fillFileContent( this.fields.tlscaInput, - remoteInstancesHelper.remote_instance.mongodb.mongodb_4_4_ssl.tlsCAFile, + inputs.tlsCAFile, ); await this.fillFileContent( this.fields.tlsCertificateFilePasswordInput, - remoteInstancesHelper.remote_instance.mongodb.mongodb_4_4_ssl.tlsCertificateKeyFilePassword, + inputs.tlsCertificateKeyFilePassword, ); await this.fillFileContent( this.fields.tlsCertificateKey, - remoteInstancesHelper.remote_instance.mongodb.mongodb_4_4_ssl.tlsCertificateKeyFile, + inputs.tlsCertificateKeyFile, ); break; case remoteInstancesHelper.services.postgresql: + inputs = { + ...remoteInstancesHelper.remote_instance.postgresql.pdpgsql_13_3, + ...this.potgresqlSettings, + }; I.fillField( this.fields.hostName, - remoteInstancesHelper.remote_instance.postgresql.pdpgsql_13_3.host, + inputs.host, ); I.fillField( this.fields.userName, - remoteInstancesHelper.remote_instance.postgresql.pdpgsql_13_3.username, + inputs.username, ); I.fillField( this.fields.password, - remoteInstancesHelper.remote_instance.postgresql.pdpgsql_13_3.password, + inputs.password, ); adminPage.customClearField(this.fields.portNumber); I.fillField( @@ -385,27 +406,31 @@ module.exports = { remoteInstancesHelper.remote_instance.postgresql.pdpgsql_13_3.port, ); I.fillField(this.fields.serviceName, serviceName); - I.fillField(this.fields.environment, this.potgresqlSettings.environment); - I.fillField(this.fields.cluster, this.potgresqlSettings.cluster); + I.fillField(this.fields.environment, inputs.environment); + I.fillField(this.fields.cluster, inputs.cluster); break; case remoteInstancesHelper.services.postgres_ssl: + inputs = { + ...remoteInstancesHelper.remote_instance.postgresql.postgres_13_3_ssl, + ...this.potgresqlSettings, + }; I.fillField( this.fields.hostName, - remoteInstancesHelper.remote_instance.postgresql.postgres_13_3_ssl.host, + inputs.host, ); adminPage.customClearField(this.fields.portNumber); I.fillField( this.fields.portNumber, - remoteInstancesHelper.remote_instance.postgresql.postgres_13_3_ssl.port, + inputs.port, ); I.fillField(this.fields.serviceName, serviceName); I.fillField( this.fields.environment, - remoteInstancesHelper.remote_instance.postgresql.postgres_13_3_ssl.environment, + inputs.environment, ); I.fillField( this.fields.cluster, - remoteInstancesHelper.remote_instance.postgresql.postgres_13_3_ssl.clusterName, + inputs.clusterName, ); I.dontSeeElement(this.fields.tlscaInput); I.dontSeeElement(this.fields.tlsCertificateKeyInput); @@ -414,71 +439,70 @@ module.exports = { I.waitForElement(this.fields.tlscaInput, 30); await this.fillFileContent( this.fields.tlscaInput, - remoteInstancesHelper.remote_instance.postgresql.postgres_13_3_ssl.tlsCAFile, + inputs.tlsCAFile, ); await this.fillFileContent( this.fields.tlsCertificateInput, - remoteInstancesHelper.remote_instance.postgresql.postgres_13_3_ssl.tlsCertFile, + inputs.tlsCertFile, ); await this.fillFileContent( this.fields.tlsCertificateKeyInput, - remoteInstancesHelper.remote_instance.postgresql.postgres_13_3_ssl.tlsKeyFile, + inputs.tlsKeyFile, ); break; case remoteInstancesHelper.services.proxysql: - I.fillField(this.fields.hostName, remoteInstancesHelper.remote_instance.proxysql.proxysql_2_1_1.host); + inputs = remoteInstancesHelper.remote_instance.proxysql.proxysql_2_1_1 + I.fillField(this.fields.hostName, inputs.host); I.fillField( this.fields.userName, - remoteInstancesHelper.remote_instance.proxysql.proxysql_2_1_1.username, + inputs.username, ); I.fillField( this.fields.password, - remoteInstancesHelper.remote_instance.proxysql.proxysql_2_1_1.password, + inputs.password, ); I.fillField(this.fields.serviceName, serviceName); - I.fillField(this.fields.environment, 'remote-proxysql'); - I.fillField(this.fields.cluster, 'remote-proxysql-cluster'); + I.fillField(this.fields.environment, inputs.environment); + I.fillField(this.fields.cluster, inputs.clusterName); break; case 'external_service_new': + inputs = remoteInstancesHelper.remote_instance.external.redis; I.fillField(this.fields.serviceName, serviceName); - I.fillField(this.fields.hostName, remoteInstancesHelper.remote_instance.external.redis.host); + I.fillField(this.fields.hostName, inputs.host); I.fillField(this.fields.metricsPath, '/metrics'); adminPage.customClearField(this.fields.portNumber); - I.fillField(this.fields.portNumber, remoteInstancesHelper.remote_instance.external.redis.port); + I.fillField(this.fields.portNumber, inputs.port); I.fillField(this.fields.environment, 'remote-external-service'); I.fillField(this.fields.cluster, 'remote-external-cluster'); break; case 'postgreDoNotTrack': case 'postgresPGStatStatements': case 'postgresPgStatMonitor': - I.fillField( - this.fields.hostName, - remoteInstancesHelper.remote_instance.postgresql.pdpgsql_13_3.host, - ); - I.fillField( - this.fields.userName, - remoteInstancesHelper.remote_instance.postgresql.pdpgsql_13_3.username, - ); - I.fillField( - this.fields.password, - remoteInstancesHelper.remote_instance.postgresql.pdpgsql_13_3.password, - ); + inputs = { + ...remoteInstancesHelper.remote_instance.postgresql.pdpgsql_13_3, + ...this.potgresqlSettings, + }; + I.fillField(this.fields.hostName,inputs.host,); + I.fillField(this.fields.userName, inputs.username,); + I.fillField(this.fields.password, inputs.password,); adminPage.customClearField(this.fields.portNumber); - I.fillField( - this.fields.portNumber, - remoteInstancesHelper.remote_instance.postgresql.pdpgsql_13_3.port, - ); + I.fillField(this.fields.portNumber, inputs.port,); I.fillField(this.fields.serviceName, serviceName); break; case remoteInstancesHelper.services.postgresGC: - I.fillField(this.fields.hostName, remoteInstancesHelper.remote_instance.gc.gc_postgresql.address); - I.fillField(this.fields.userName, remoteInstancesHelper.remote_instance.gc.gc_postgresql.userName); - I.fillField(this.fields.password, remoteInstancesHelper.remote_instance.gc.gc_postgresql.password); + inputs = { + ...remoteInstancesHelper.remote_instance.gc.gc_postgresql, + ...this.postgresGCSettings, + }; + I.fillField(this.fields.hostName, inputs.address); + I.fillField(this.fields.userName, inputs.userName); + I.fillField(this.fields.password, inputs.password); I.fillField(this.fields.serviceName, serviceName); - I.fillField(this.fields.environment, this.postgresGCSettings.environment); - I.fillField(this.fields.cluster, this.postgresGCSettings.cluster); + I.fillField(this.fields.environment, inputs.environment); + I.fillField(this.fields.cluster, inputs.cluster); } adminPage.performPageDown(1); + return inputs; }, createRemoteInstance(serviceName) { @@ -573,32 +597,40 @@ module.exports = { I.fillField(this.fields.replicationSet, serviceParameters.replicationSet); }, - fillRemoteRDSFields(serviceName) { + async fillRemoteRDSFields(serviceName) { + let inputs; // eslint-disable-next-line default-case switch (serviceName) { case 'rds-mysql56': - this.fillFields(this.mysqlInputs); + inputs = this.mysqlInputs; + this.fillFields(inputs); break; case 'pmm-qa-mysql-8-0-30': - this.fillFields(this.mysql80rdsInput); + inputs = this.mysql80rdsInput; + this.fillFields(inputs); break; case 'pmm-qa-rds-mysql-5-7-39': - this.fillFields(this.mysql57rdsInput); + inputs = this.mysql57rdsInput; + this.fillFields(inputs); break; case 'pmm-qa-pgsql-12': - this.fillFields(this.postgresqlInputs); + inputs = this.postgresqlInputs; + this.fillFields(inputs); break; case 'azure-MySQL': + inputs = this.mysqlAzureInputs; adminPage.customClearField(this.fields.serviceName); I.fillField(this.fields.serviceName, serviceName); - this.fillFields(this.mysqlAzureInputs); + this.fillFields(inputs); break; case 'azure-PostgreSQL': + inputs = this.postgresqlAzureInputs; adminPage.customClearField(this.fields.serviceName); I.fillField(this.fields.serviceName, serviceName); - this.fillFields(this.postgresqlAzureInputs); + this.fillFields(inputs); } I.scrollPageToBottom(); + return inputs; }, parseURL(url) { diff --git a/tests/remoteInstances/remoteInstancesHelper.js b/tests/remoteInstances/remoteInstancesHelper.js index b2298b2ee..98ce1a9d8 100644 --- a/tests/remoteInstances/remoteInstancesHelper.js +++ b/tests/remoteInstances/remoteInstancesHelper.js @@ -187,6 +187,7 @@ module.exports = { port: DB_CONFIG.PROXYSQL_SERVER_PORT, username: 'proxyadmin', password: 'yxZq!4SGv0A1', + environment: 'proxy_env', clusterName: 'proxy_clstr', }, },