Skip to content
Closed
Changes from all commits
Commits
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
58 changes: 41 additions & 17 deletions cli/tests/generic.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@ const PGSQL_USER = 'postgres';
const PGSQL_PASSWORD = 'pass+this';
const ipPort = async () => ((await cli.exec('docker ps')).stdout.includes('pdpgsql_pmm_') ? '127.0.0.1:5432' : '127.0.0.1:5447');

const getClientImageVersion = (): string => {
const clientImage = process.env.CLIENT_IMAGE ?? 'perconalab/pmm-client:3-dev-latest';
return JSON.parse(
cli.execute(`docker run --rm --entrypoint pmm-admin ${clientImage} --version --json`).stdout,
).Version;
};

test.describe('PMM Client "Generic" CLI tests', { tag: '@generic' }, async () => {
test.beforeAll(async ({}) => {
const result = await cli.exec('docker ps | grep pdpgsql_pmm | awk \'{print $NF}\'');
Expand All @@ -17,10 +24,9 @@ test.describe('PMM Client "Generic" CLI tests', { tag: '@generic' }, async () =>

let PMM_VERSION = `${process.env.CLIENT_VERSION}`;
if (/latest-tarball|3-dev-latest|pmm3-rc|https:/.test(PMM_VERSION)) {
// TODO: refactor to use docker hub API to remove file-update dependency
// See: https://github.com/Percona-QA/package-testing/blob/master/playbooks/pmm2-client_integration_upgrade_custom_path.yml#L41
PMM_VERSION = cli.execute('curl -s https://raw.githubusercontent.com/Percona-Lab/pmm-submodules/v3/VERSION')
.stdout.trim();
PMM_VERSION = process.env.CLIENT_IMAGE
? getClientImageVersion()
: cli.execute('curl -s https://raw.githubusercontent.com/Percona-Lab/pmm-submodules/v3/VERSION').stdout.trim();
}

test('Verify pt summary for mysql mongodb and pgsql', async ({}) => {
Expand Down Expand Up @@ -570,34 +576,52 @@ test.describe('PMM Client "Generic" CLI tests', { tag: '@generic' }, async () =>

test('PMM-T2227 - Verify tarball upgrade @generic', async ({}) => {
const containerName = 'tarball_client';
const tarballURL = process.env.PMM_CLIENT_VERSION?.includes('http')
? process.env.PMM_CLIENT_VERSION
: 'https://pmm-build-cache.s3.us-east-2.amazonaws.com/PR-BUILDS/pmm-client/pmm-client-latest.tar.gz';
const expectedUpgradeVersion = getClientImageVersion();

await cli.exec('docker network create pmm-qa || true');
await cli.exec('docker network connect pmm-server pmm-qa');
await cli.exec('docker network connect pmm-qa pmm-server || true');
await cli.exec(`docker rm -f ${containerName} 2>/dev/null || true`);
await cli.exec(`docker run --rm -d --name="${containerName}" --network="pmm-qa" --privileged --cgroupns=host -v /sys/fs/cgroup:/sys/fs/cgroup:rw -v /var/lib/containerd antmelekhin/docker-systemd:almalinux-10`);
const latestReleasedVersion = (await cli.exec('wget -q https://registry.hub.docker.com/v2/repositories/percona/pmm-client/tags -O - | jq -r .results[].name | grep -v latest | sort -V | tail -n1')).stdout;
await expect(async () => {
const status = await cli.exec(`docker inspect -f '{{.State.Running}}' ${containerName}`);
expect(status.stdout.trim()).toBe('true');
}).toPass({ intervals: [1_000], timeout: 60_000 });
const latestReleasedVersion = (await cli.exec('wget -q https://registry.hub.docker.com/v2/repositories/percona/pmm-client/tags -O - | jq -r .results[].name | grep -v latest | sort -V | tail -n1')).stdout.trim();
await cli.exec(`docker cp ../package_tests/scripts/pmm3_client_install_tarball.sh ${containerName}:/`);
await cli.exec(`docker exec ${containerName} dnf install -y wget`);
await cli.exec(`docker exec ${containerName} /pmm3_client_install_tarball.sh -v ${latestReleasedVersion}`);
await (await cli.exec(`docker exec ${containerName} /pmm3_client_install_tarball.sh -v '${latestReleasedVersion}'`)).assertSuccess();
await cli.exec(`docker exec ${containerName} pmm-agent setup --config-file=/usr/local/percona/pmm/config/pmm-agent.yaml --force --server-insecure-tls --server-address=pmm-server:8443 --server-username=admin --server-password=admin 127.0.0.1 generic tarball_node`);
await cli.exec(`docker exec -d ${containerName} pmm-agent --debug --config-file=/usr/local/percona/pmm/config/pmm-agent.yaml`);
const adminStatus = await cli.exec(`docker exec ${containerName} pmm-admin status`);
const oldVersion = await cli.exec(`docker exec ${containerName} pmm-admin version | grep "Version:"`);
const oldVersion = await cli.exec(`docker exec ${containerName} pmm-admin version | grep "^Version:"`);
const oldPid = await cli.exec(`docker exec ${containerName} ps -C pmm-agent -o pid=`);

await adminStatus.outContains('Connected');
await oldVersion.outContains(latestReleasedVersion);
const tarballURL = process.env.PMM_CLIENT_VERSION!.includes('http') ? process.env.PMM_CLIENT_VERSION : 'https://pmm-build-cache.s3.us-east-2.amazonaws.com/PR-BUILDS/pmm-client/pmm-client-latest.tar.gz';

await cli.exec(`docker exec ${containerName} /pmm3_client_install_tarball.sh -v ${tarballURL} -u`);
await cli.exec(`docker exec ${containerName} pkill -f pmm-agent`);
await (await cli.exec(`docker exec ${containerName} /pmm3_client_install_tarball.sh -v '${tarballURL}' -u`)).assertSuccess();
await cli.exec(`docker exec ${containerName} pkill -9 -f pmm-agent || true`);
await expect(async () => {
const ps = await cli.exec(`docker exec ${containerName} pgrep -c pmm-agent || true`);
expect(parseInt(ps.stdout.trim(), 10) || 0).toBe(0);
}).toPass({ intervals: [500], timeout: 10_000 });
await cli.exec(`docker exec -d ${containerName} pmm-agent --debug --config-file=/usr/local/percona/pmm/config/pmm-agent.yaml`);

const newPid = await cli.exec(`docker exec ${containerName} ps -C pmm-agent -o pid=`);
const latestVersion = (await cli.exec('curl -s https://raw.githubusercontent.com/Percona-Lab/pmm-submodules/v3/VERSION')).stdout.trim();
const newAdminStatus = await cli.exec(`docker exec ${containerName} pmm-admin status`);
const newVersion = await cli.exec(`docker exec ${containerName} pmm-admin version | grep "Version:"`);
const newVersion = await cli.exec(`docker exec ${containerName} pmm-admin version | grep "^Version:"`);
const oldPidValue = oldPid.stdout.trim();

await newPid.outNotContains(oldPid.stdout);
await expect(async () => {
const newPid = await cli.exec(`docker exec ${containerName} ps -C pmm-agent -o pid=`);
const pids = newPid.getStdOutLines().map((pid) => pid.trim());
expect(pids, 'PMM Agent should be running after upgrade').toHaveLength(1);
expect(pids[0], `PMM Agent was not restarted. Old PID: ${oldPidValue}, New PID: ${pids[0]}`).not.toBe(oldPidValue);
}).toPass({ intervals: [1_000], timeout: 30_000 });
await newAdminStatus.outContains('Connected');
await newVersion.outContains(latestVersion);
await newVersion.outContains(expectedUpgradeVersion);

await cli.exec(`docker rm -f ${containerName}`);
});
});
Loading