Skip to content

Commit 55f229b

Browse files
MySQL Router Docker
1 parent 8a9d8d1 commit 55f229b

File tree

12 files changed

+225
-90
lines changed

12 files changed

+225
-90
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Before running set environment variables, eg.:
2+
3+
export DOCKER_ACC="percona"
4+
export PS_VERSION="8.0.32-24"
5+
export ROUTER_VERSION="8.0.32"
6+
export TESTING_BRANCH="master"
7+
This is based on: https://testinfra.readthedocs.io/en/latest/examples.html#test-docker-images
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#!/usr/bin/env bash
2+
rm -f report.xml
3+
rm -rf .pytest_cache
4+
rm -rf __pycache__
5+
rm -rf tests/__pycache__
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
atomicwrites==1.3.0
2+
attrs==19.3.0
3+
importlib-metadata==0.23
4+
more-itertools==7.2.0
5+
packaging==19.2
6+
pluggy==0.13.0
7+
py==1.10.0
8+
pyparsing==2.4.2
9+
pytest==5.2.1
10+
six==1.12.0
11+
testinfra==3.2.0
12+
wcwidth==0.1.7
13+
zipp==0.6.0
14+
requests==2.27.1
15+
docker==5.0.3
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#!/usr/bin/env bash
2+
pytest -v --junit-xml report.xml $@
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import os
2+
3+
router_version = os.getenv('ROUTER_VERSION')
4+
docker_tag = os.getenv('ROUTER_VERSION')
5+
docker_acc = os.getenv('DOCKER_ACC')
6+
7+
docker_product = 'percona-mysql-router'
8+
docker_image = docker_acc + "/" + docker_product + ":" + docker_tag
9+
ps_pwd = 'inno'
10+
11+
RHEL_DISTS = ["redhat", "centos", "rhel", "oracleserver", "ol", "amzn"]
12+
13+
DEB_DISTS = ["debian", "ubuntu"]
14+
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#!/usr/bin/env python3
2+
import pytest
3+
import subprocess
4+
import testinfra
5+
import time
6+
from settings import *
7+
8+
container_name = 'router-docker-test-static'
9+
10+
@pytest.fixture(scope='module')
11+
def host():
12+
docker_id = subprocess.check_output(
13+
['docker', 'run', '--name', container_name, '-d', docker_image ], stderr=subprocess.STDOUT ).decode().strip()
14+
time.sleep(20)
15+
subprocess.check_call(['docker','exec','--user','root',container_name,'microdnf','install', '-y', 'net-tools'])
16+
time.sleep(20)
17+
yield testinfra.get_host("docker://root@" + docker_id)
18+
subprocess.check_call(['docker', 'rm', '-f', docker_id])
19+
20+
21+
class TestRouterEnvironment:
22+
def test_packages(self, host):
23+
pkg = host.package("percona-mysql-router")
24+
dist = host.system_info.distribution
25+
assert pkg.is_installed
26+
if dist.lower() in RHEL_DISTS:
27+
assert router_version in pkg.version+'-'+pkg.release, pkg.version+'-'+pkg.release
28+
else:
29+
assert router_version in pkg.version, pkg.version
30+
31+
def test_binaries_exist(self, host):
32+
router_binary="/tmp/mysqlrouter"
33+
assert host.file(router_binary).exists
34+
assert oct(host.file(router_binary).mode) == '0o755'
35+
36+
def test_binaries_version(self, host):
37+
assert router_version in host.check_output("/tmp/mysqlrouter --version")
38+
39+
# def test_process_running(self, host):
40+
# assert host.process.get(user="mysql", comm="orchestrator")
41+
42+
def test_http_port_6446(self, host):
43+
assert host.socket('tcp://127.0.0.1:6446').is_listening
44+
45+
def test_raft_port_6447(self, host):
46+
assert host.socket('tcp://127.0.0.1:6447').is_listening
47+
48+
def test_mysql_user(self, host):
49+
assert host.user('mysql').exists
50+
assert host.user('mysql').uid == 1001
51+
assert host.user('mysql').gid == 1001
52+
assert 'mysql' in host.user('mysql').groups
53+
54+
def test_mysql_group(self, host):
55+
assert host.group('mysql').exists
56+
assert host.group('mysql').gid == 1001
57+
58+
def test_router_permissions(self, host):
59+
assert host.file('/var/lib/mysqlrouter').user == 'mysql'
60+
assert host.file('/var/lib/mysqlrouter').group == 'mysql'
61+
assert oct(host.file('/var/lib/mysqlrouter').mode) == '0o755'
62+
63+
def test_mysqlrouter_version(self, host):
64+
cmd = host.run("mysqlrouter --version")
65+
assert router_version in cmd.stdout
66+
67+
68+
def test_mysqlsh_version(self, host):
69+
cmd = host.run("mysqlsh --version")
70+
assert PS_VERSION in cmd.stdout
Binary file not shown.
Binary file not shown.

docker-image-tests/percona-mysql-router/tests/__init__.py

Whitespace-only changes.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/usr/bin/env python3
2+
import pytest
3+
import subprocess
4+
import testinfra
5+
import json
6+
from settings import *
7+
8+
container_name = 'router-docker-test-inspect'
9+
10+
@pytest.fixture(scope='module')
11+
def inspect_data():
12+
docker_id = subprocess.check_output(
13+
['docker', 'run', '--name', container_name, '-d', docker_image], stderr=subprocess.STDOUT ).decode().strip()
14+
inspect_data = json.loads(subprocess.check_output(['docker','inspect',container_name]))
15+
yield inspect_data[0]
16+
subprocess.check_call(['docker', 'rm', '-f', docker_id])
17+
18+
19+
class TestContainerAttributes:
20+
def test_status(self, inspect_data):
21+
assert inspect_data['State']['Status'] == 'running'
22+
assert inspect_data['State']['Running'] == True
23+
24+
def test_config(self, inspect_data):
25+
assert len(inspect_data['Config']['Cmd']) == 1
26+
assert inspect_data['Config']['Cmd'][0] == 'mysqlrouter'
27+
28+
def test_image_name(self, inspect_data):
29+
assert inspect_data['Config']['Image'] == docker_image
30+
31+
def test_volumes(self, inspect_data):
32+
assert len(inspect_data['Config']['Volumes']) == 1
33+
assert '/var/lib/mysqlrouter' in inspect_data['Config']['Volumes']
34+
35+
def test_entrypoint(self, inspect_data):
36+
assert len(inspect_data['Config']['Entrypoint']) == 1
37+
assert inspect_data['Config']['Entrypoint'][0] == '/entrypoint.sh'
38+

0 commit comments

Comments
 (0)