Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

EVEREST-1471 initial tests for upgrade #709

Draft
wants to merge 25 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
8e360e5
EVEREST-1471 initial tests for upgrade
yurkovychv Sep 23, 2024
528e515
chore: lint/format
yurkovychv Sep 23, 2024
2869c87
EVEREST-1471 initial tests for upgrade
yurkovychv Sep 23, 2024
bd11087
Merge remote-tracking branch 'origin/EVEREST-1471-upgrade-tests' into…
yurkovychv Sep 23, 2024
33ab749
EVEREST-1471 initial tests for upgrade
yurkovychv Sep 23, 2024
3c4c79a
chore: lint/format
yurkovychv Sep 23, 2024
094534f
EVEREST-1471 initial tests for upgrade
yurkovychv Sep 23, 2024
e871836
Merge remote-tracking branch 'origin/EVEREST-1471-upgrade-tests' into…
yurkovychv Sep 23, 2024
b0e6531
EVEREST-1471 add await for goto
yurkovychv Sep 23, 2024
32c1e4c
EVEREST-1471 add wait for db clusters
yurkovychv Sep 23, 2024
0de8223
chore: lint/format
yurkovychv Sep 23, 2024
2fa7c8b
EVEREST-1471 add wait for db clusters
yurkovychv Sep 24, 2024
254b20d
Merge remote-tracking branch 'origin/EVEREST-1471-upgrade-tests' into…
yurkovychv Sep 24, 2024
6d00310
EVEREST-1471 add wait for db clusters
yurkovychv Sep 24, 2024
ff5b036
chore: lint/format
yurkovychv Sep 24, 2024
c7a4a73
EVEREST-1471 add wait for db clusters
yurkovychv Sep 24, 2024
e9c55bd
Merge remote-tracking branch 'origin/EVEREST-1471-upgrade-tests' into…
yurkovychv Sep 24, 2024
5108efc
EVEREST-1471 update get db clusters list api call
yurkovychv Sep 24, 2024
ff16f96
chore: lint/format
yurkovychv Sep 24, 2024
1db19a5
EVEREST-1471 update get db clusters list api call
yurkovychv Sep 24, 2024
e8fb9a9
Merge remote-tracking branch 'origin/EVEREST-1471-upgrade-tests' into…
yurkovychv Sep 24, 2024
08ff3b7
EVEREST-1471 update auth
yurkovychv Sep 24, 2024
7c905ad
chore: lint/format
yurkovychv Sep 24, 2024
280031f
EVEREST-1471 update auth
yurkovychv Sep 24, 2024
fd625a2
Merge remote-tracking branch 'origin/EVEREST-1471-upgrade-tests' into…
yurkovychv Sep 24, 2024
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
8 changes: 5 additions & 3 deletions ui/apps/everest/.e2e/auth.setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,17 @@
// limitations under the License.

import { expect, test as setup } from '@playwright/test';
import { STORAGE_STATE_FILE } from './constants';
import { STORAGE_STATE_FILE, TIMEOUT } from './constants';
const { CI_USER, CI_PASSWORD } = process.env;

setup('Login', async ({ page }) => {
page.goto('/login');
await page.goto('/login');
await page.getByTestId('text-input-username').fill(CI_USER);
await page.getByTestId('text-input-password').fill(CI_PASSWORD);
await page.getByTestId('login-button').click();
await expect(page.getByText('Create database')).toBeVisible();
await expect(page.getByText('Create database')).toBeVisible({
timeout: TIMEOUT.ThirtySeconds,
});

const origins = (await page.context().storageState()).origins;
expect(origins.length).toBeGreaterThan(0);
Expand Down
22 changes: 21 additions & 1 deletion ui/apps/everest/.e2e/constants.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const { EVEREST_BUCKETS_NAMESPACES_MAP } = process.env;
const { EVEREST_BUCKETS_NAMESPACES_MAP, EVEREST_DIR, TAG_FOR_UPGRADE } =
process.env;

type BucketsNamespaceMap = [string, string[]][];

Expand All @@ -13,3 +14,22 @@ export enum EVEREST_CI_NAMESPACES {

export const getBucketNamespacesMap = (): BucketsNamespaceMap =>
JSON.parse(EVEREST_BUCKETS_NAMESPACES_MAP);

export const everestdir = EVEREST_DIR;
export const everestTagForUpgrade = TAG_FOR_UPGRADE;

const second = 1_000;
const minute = 60 * second;

export enum TIMEOUT {
TenSeconds = 10 * second,
ThirtySeconds = 30 * second,
OneMinute = minute,
ThreeMinutes = 3 * minute,
FiveMinutes = 5 * minute,
TenMinutes = 10 * minute,
FifteenMinutes = 15 * minute,
TwentyMinutes = 20 * minute,
ThirtyMinutes = 30 * minute,
SixtyMinutes = 60 * minute,
}
5 changes: 3 additions & 2 deletions ui/apps/everest/.e2e/playwright.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import { defineConfig } from '@playwright/test';
import path from 'path';
import { fileURLToPath } from 'url';
import { STORAGE_STATE_FILE } from './constants';
import { STORAGE_STATE_FILE, TIMEOUT } from './constants';
import 'dotenv/config';

const __filename = fileURLToPath(import.meta.url);
Expand All @@ -42,6 +42,7 @@ export default defineConfig({
retries: process.env.CI ? 2 : 1,
/* Opt out of parallel tests on CI. */
workers: 1,
timeout: TIMEOUT.TwentyMinutes,
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
reporter: [
['github'],
Expand All @@ -51,7 +52,7 @@ export default defineConfig({
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
use: {
/* Base URL to use in actions like `await page.goto('/')`. */
baseURL: 'http://localhost:3000',
baseURL: process.env.EVEREST_URL || 'http://localhost:3000',
extraHTTPHeaders: {
'Content-Type': 'application/json',
Accept: 'application/json',
Expand Down
14 changes: 14 additions & 0 deletions ui/apps/everest/.e2e/upgrade/post-upgrade.e2e.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { expect, test } from '@playwright/test';
import fs from 'fs';
import { everestdir } from '../constants';
import { expectedEverestUpgradeLog } from './testData';

test.describe('Post upgrade tests', { tag: '@post-upgrade' }, async () => {
test('Verify upgrade.log file', async ({ page }) => {
const filePath = `${everestdir}/ui/apps/everest/.e2e/upgrade.log`;
const data = fs.readFileSync(filePath, 'utf8');

Check failure on line 9 in ui/apps/everest/.e2e/upgrade/post-upgrade.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E_tests_workflow / e2e

[Chrome Stable] › ../upgrade/post-upgrade.e2e.ts:7:3 › Post upgrade tests › Verify upgrade.log file

1) [Chrome Stable] › ../upgrade/post-upgrade.e2e.ts:7:3 › Post upgrade tests › Verify upgrade.log file Error: ENOENT: no such file or directory, open 'undefined/ui/apps/everest/.e2e/upgrade.log' 7 | test('Verify upgrade.log file', async ({ page }) => { 8 | const filePath = `${everestdir}/ui/apps/everest/.e2e/upgrade.log`; > 9 | const data = fs.readFileSync(filePath, 'utf8'); | ^ 10 | 11 | const expectedText = expectedEverestUpgradeLog(); 12 | expect(data).toContain(expectedText); at /home/runner/work/everest/everest/ui/apps/everest/.e2e/upgrade/post-upgrade.e2e.ts:9:21

Check failure on line 9 in ui/apps/everest/.e2e/upgrade/post-upgrade.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E_tests_workflow / e2e

[Chrome Stable] › ../upgrade/post-upgrade.e2e.ts:7:3 › Post upgrade tests › Verify upgrade.log file

1) [Chrome Stable] › ../upgrade/post-upgrade.e2e.ts:7:3 › Post upgrade tests › Verify upgrade.log file Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: ENOENT: no such file or directory, open 'undefined/ui/apps/everest/.e2e/upgrade.log' 7 | test('Verify upgrade.log file', async ({ page }) => { 8 | const filePath = `${everestdir}/ui/apps/everest/.e2e/upgrade.log`; > 9 | const data = fs.readFileSync(filePath, 'utf8'); | ^ 10 | 11 | const expectedText = expectedEverestUpgradeLog(); 12 | expect(data).toContain(expectedText); at /home/runner/work/everest/everest/ui/apps/everest/.e2e/upgrade/post-upgrade.e2e.ts:9:21

Check failure on line 9 in ui/apps/everest/.e2e/upgrade/post-upgrade.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E_tests_workflow / e2e

[Chrome Stable] › ../upgrade/post-upgrade.e2e.ts:7:3 › Post upgrade tests › Verify upgrade.log file

1) [Chrome Stable] › ../upgrade/post-upgrade.e2e.ts:7:3 › Post upgrade tests › Verify upgrade.log file Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── Error: ENOENT: no such file or directory, open 'undefined/ui/apps/everest/.e2e/upgrade.log' 7 | test('Verify upgrade.log file', async ({ page }) => { 8 | const filePath = `${everestdir}/ui/apps/everest/.e2e/upgrade.log`; > 9 | const data = fs.readFileSync(filePath, 'utf8'); | ^ 10 | 11 | const expectedText = expectedEverestUpgradeLog(); 12 | expect(data).toContain(expectedText); at /home/runner/work/everest/everest/ui/apps/everest/.e2e/upgrade/post-upgrade.e2e.ts:9:21

const expectedText = expectedEverestUpgradeLog();
expect(data).toContain(expectedText);
});
});
58 changes: 58 additions & 0 deletions ui/apps/everest/.e2e/upgrade/pre-upgrade.e2e.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { expect, test } from '@playwright/test';
import { createDbClusterFn } from '../utils/db-cluster';
import { mongoDBCluster, postgresDBCluster, psDBCluster } from './testData';
import { getDBClustersList } from '../utils/db-clusters-list';
import { TIMEOUT } from '../constants';

test.describe.configure({ retries: 0 });
test(
'Pre upgrade setup',
{ tag: '@pre-upgrade' },
async ({ page, request }) => {
await createDbClusterFn(request, {
dbName: psDBCluster.name,
dbType: 'mysql',
numberOfNodes: psDBCluster.numberOfNodes,
cpu: psDBCluster.cpu,
disk: psDBCluster.disk,
memory: psDBCluster.memory,
externalAccess: psDBCluster.externalAccess,
sourceRanges: psDBCluster.sourceRanges,
});

await createDbClusterFn(request, {
dbName: mongoDBCluster.name,
dbType: 'mongodb',
numberOfNodes: mongoDBCluster.numberOfNodes,
cpu: mongoDBCluster.cpu,
disk: mongoDBCluster.disk,
memory: mongoDBCluster.disk,
externalAccess: mongoDBCluster.externalAccess,
});

await createDbClusterFn(request, {
dbName: postgresDBCluster.name,
dbType: 'postgresql',
numberOfNodes: postgresDBCluster.numberOfNodes,
cpu: postgresDBCluster.cpu,
disk: postgresDBCluster.disk,
memory: postgresDBCluster.disk,
externalAccess: postgresDBCluster.externalAccess,
});

await page.waitForTimeout(TIMEOUT.TenSeconds);
const clusters = (await getDBClustersList(request)).items;
console.log(clusters);

await expect(async () => {
const clusters = (await getDBClustersList(request)).items;

clusters.map((c) => {
expect(c.status.status).toBe('ready');
});
}).toPass({

Check failure on line 53 in ui/apps/everest/.e2e/upgrade/pre-upgrade.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E_tests_workflow / e2e

[Chrome Stable] › ../upgrade/pre-upgrade.e2e.ts:8:1 › Pre upgrade setup

2) [Chrome Stable] › ../upgrade/pre-upgrade.e2e.ts:8:1 › Pre upgrade setup ─────────────────────── Error: expect(received).toBe(expected) // Object.is equality Expected: "ready" Received: "deleting" Call Log: - Timeout 600000ms exceeded while waiting on the predicate 51 | expect(c.status.status).toBe('ready'); 52 | }); > 53 | }).toPass({ | ^ 54 | timeout: TIMEOUT.TenMinutes, 55 | intervals: [TIMEOUT.OneMinute], 56 | }); at /home/runner/work/everest/everest/ui/apps/everest/.e2e/upgrade/pre-upgrade.e2e.ts:53:8
timeout: TIMEOUT.TenMinutes,
intervals: [TIMEOUT.OneMinute],
});
}
);
54 changes: 54 additions & 0 deletions ui/apps/everest/.e2e/upgrade/testData.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { everestTagForUpgrade } from '../constants';

export const psDBCluster = {
name: 'ps-db-cluster',
numberOfNodes: 1,
cpu: 0.6,
disk: 1,
memory: 1,
externalAccess: true,
sourceRanges: [
{
sourceRange: 'http://192.168.1.1',
},
],
};

export const mongoDBCluster = {
name: 'mongo-db-cluster',
numberOfNodes: 3,
cpu: 1,
disk: 1,
memory: 1,
externalAccess: true,
};

export const postgresDBCluster = {
name: 'postgres-db-cluster',
numberOfNodes: 1,
cpu: 1,
disk: 1,
memory: 1,
externalAccess: true,
};

export const expectedEverestUpgradeLog = (tag = everestTagForUpgrade) => {
return `✓ Upgrade Operator Lifecycle Manager
✓ Upgrade Percona Catalog
✓ Wait for Everest Operator InstallPlan
✓ Upgrade Everest API server
✓ Upgrade Everest Operator
✓ Run post-upgrade tasks

🚀 Everest has been upgraded to version ${tag}


To view the password for the 'admin' user, run the following command:

everestctl accounts initial-admin-password


IMPORTANT: This password is NOT stored in a hashed format. To secure it, update the password using the following command:

everestctl accounts set-password --username admin`;
};
26 changes: 17 additions & 9 deletions ui/apps/everest/.e2e/utils/db-clusters-list.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,24 @@

import { APIRequestContext, expect, Page } from '@playwright/test';
import { findRowAndClickActions } from './table';
import { getTokenFromLocalStorage } from './localStorage';
import { getNamespacesFn } from './namespaces';

export const getDBClustersList = async (
token: string,
request: APIRequestContext
) => {
const response = await request.get('/v1/database-clusters', {
headers: {
Authorization: `Bearer ${token}`,
},
});
export const getDBClustersList = async (request: APIRequestContext) => {
const token = await getTokenFromLocalStorage();
const namespaces = await getNamespacesFn(token, request);
const namespace = namespaces[0];

const response = await request.get(
`/v1/namespaces/${namespace}/database-clusters`,
{
headers: {
Authorization: `Bearer ${token}`,
},
}
);

expect(response.status()).toBe(200);

expect(response.ok()).toBeTruthy();
return response.json();
Expand Down
Loading