Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions packages/manager/.changeset/pr-11928-tests-1743086335061.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Tests
---

Add database configuration to test 2 node cluster and validate dbaas v2 create/summary view ([#11928](https://github.com/linode/manager/pull/11928))
102 changes: 99 additions & 3 deletions packages/manager/cypress/e2e/core/databases/create-database.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,13 +62,59 @@ describe('create a database cluster, mocked data', () => {
});

const clusterSizeSelection =
configuration.clusterSize > 1 ? '3 Nodes' : '1 Node';
configuration.clusterSize == 1
? '1 Node'
: configuration.clusterSize == 2
? '2 Nodes'
: '3 Nodes';

const nodes =
configuration.clusterSize == 1
? 'Primary (1 Node)'
: configuration.clusterSize == 2
? 'Primary (+1 Node)'
: 'Primary (+2 Nodes)';

const clusterCpuType =
configuration.linodeType.indexOf('-dedicated-') !== -1
? 'Dedicated CPU'
: 'Shared CPU';

// Function to validate Action Menu on the landing page as per db cluster status
const validateActionItems = (state: string) => {
const menuStates: Record<string, Record<string, boolean>> = {
active: {
Delete: true,
'Manage Access Controls': true,
'Reset Root Password': true,
Resize: true,
Resume: false,
Suspend: true,
},
provisioning: {
Delete: true,
'Manage Access Controls': true,
'Reset Root Password': true,
Resize: true,
Resume: false,
Suspend: false,
},
};
const expectedItems = menuStates[state];
ui.actionMenu
.findByTitle(`Action menu for Database ${databaseMock.label}`)
.should('be.visible')
.click();

Object.entries(expectedItems).forEach(([label, enabled]) => {
ui.actionMenuItem
.findByTitle(label)
.should('be.visible')
.should(enabled ? 'be.enabled' : 'be.disabled');
});
cy.get('body').click(0, 0);
};

// Mock account to ensure 'Managed Databases' capability.
mockGetAccount(accountFactory.build()).as('getAccount');
mockGetDatabaseEngines(mockDatabaseEngineTypes).as(
Expand Down Expand Up @@ -108,6 +154,34 @@ describe('create a database cluster, mocked data', () => {
// Database cluster size selection.
cy.contains(clusterSizeSelection).should('be.visible').click();

if (clusterCpuType == 'Shared CPU') {
cy.findByLabelText('2 Nodes - High Availability').should('not.exist');
}

// Manage Access while creating a cluster for ipv4 and ipv6
if (configuration.ip) {
cy.findByText('Specific Access (recommended)')
.should('be.visible')
.click();
cy.get('[id="domain-transfer-ip-0"]').should('be.visible').click();
cy.focused().type(configuration.ip);
cy.findByText('Add an IP').should('be.visible').click();
}

if (!configuration.ip) {
cy.findByText('No Access (Deny connections from all IP addresses)')
.should('be.visible')
.click();
cy.get('[id="domain-transfer-ip-0"]')
.should('be.visible')
.should('be.disabled');
cy.findByText('Add an IP').should('be.visible').should('be.disabled');
}

// Summary section, TODO validating plan details.
cy.findByText('Summary').should('be.visible');
cy.findAllByTestId('currentSummary').should('be.visible');

// Create database, confirm redirect, and that new instance is listed.
cy.findByText('Create Database Cluster').should('be.visible').click();
cy.wait('@createDatabase');
Expand All @@ -118,8 +192,24 @@ describe('create a database cluster, mocked data', () => {
`/databases/${databaseMock.engine}/${databaseMock.id}`
);

cy.findByText(databaseMock.label).should('be.visible');
cy.findByText(databaseRegionLabel).should('be.visible');
// Validate Cluster Configuration on Summary page
[
'Status',
'Plan',
'Nodes',
'CPUs',
'Engine',
'Region',
'RAM',
'Total Disk Size',
databaseMock.label,
databaseRegionLabel,
`${configuration.engine} v${configuration.version}`,
nodes,
`${databaseMock.total_disk_size_gb} GB`,
].forEach((text: string) => {
cy.findByText(text).should('be.visible');
});

// Navigate back to landing page.
ui.entityHeader.find().within(() => {
Expand All @@ -142,6 +232,9 @@ describe('create a database cluster, mocked data', () => {
}).should('be.visible');
});

// Confirm enabled dropdown option when cluster is in provisioning state
validateActionItems('provisioning');

// Mock next request to fetch databases so that instance appears active.
// Mock next event request to trigger Cloud to re-fetch DBaaS instances.
mockGetDatabases([databaseMockActive]).as('getDatabases');
Expand All @@ -154,6 +247,9 @@ describe('create a database cluster, mocked data', () => {
.within(() => {
cy.findByText('Active').should('be.visible');
});

// Confirm enabled dropdown options when cluster is in active state
validateActionItems('active');
});
}
);
Expand Down
18 changes: 17 additions & 1 deletion packages/manager/cypress/support/constants/databases.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import type {
DatabaseEngine,
DatabaseType,
} from '@linode/api-v4';
import { randomLabel } from 'support/util/random';
import { randomIp, randomLabel } from 'support/util/random';
import { chooseRegion } from 'support/util/regions';
import { databaseEngineFactory, databaseTypeFactory } from '@src/factories';

Expand All @@ -17,6 +17,7 @@ export interface databaseClusterConfiguration {
linodeType: string;
region: Region;
version: string;
ip: string;
}

/**
Expand Down Expand Up @@ -334,6 +335,17 @@ export const databaseConfigurations: databaseClusterConfiguration[] = [
linodeType: 'g6-nanode-1',
region: chooseRegion({ capabilities: ['Managed Databases'] }),
version: '8',
ip: randomIp(),
},
{
clusterSize: 2,
dbType: 'mysql',
engine: 'MySQL',
label: randomLabel(),
linodeType: 'g6-dedicated-2',
region: chooseRegion({ capabilities: ['Managed Databases'] }),
version: '8',
ip: '8e61:f9e9:8d40:6e0a:cbff:c97a:2692:827e',
},
{
clusterSize: 3,
Expand All @@ -343,6 +355,7 @@ export const databaseConfigurations: databaseClusterConfiguration[] = [
linodeType: 'g6-dedicated-2',
region: chooseRegion({ capabilities: ['Managed Databases'] }),
version: '5',
ip: '',
},
// {
// label: randomLabel(),
Expand All @@ -362,6 +375,7 @@ export const databaseConfigurations: databaseClusterConfiguration[] = [
linodeType: 'g6-nanode-1',
region: chooseRegion({ capabilities: ['Managed Databases'] }),
version: '13',
ip: randomIp(),
},
];

Expand All @@ -374,6 +388,7 @@ export const databaseConfigurationsResize: databaseClusterConfiguration[] = [
linodeType: 'g6-standard-6',
region: chooseRegion({ capabilities: ['Managed Databases'] }),
version: '8',
ip: randomIp(),
},
{
clusterSize: 3,
Expand All @@ -383,5 +398,6 @@ export const databaseConfigurationsResize: databaseClusterConfiguration[] = [
linodeType: 'g6-dedicated-16',
region: chooseRegion({ capabilities: ['Managed Databases'] }),
version: '5',
ip: randomIp(),
},
];