CHANGE: Added auto-tests with Docker.
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -3,4 +3,4 @@ venv/
|
|||||||
export/
|
export/
|
||||||
*_host_ids.txt
|
*_host_ids.txt
|
||||||
*.log
|
*.log
|
||||||
partitioning/tests/
|
backup/
|
||||||
|
|||||||
36
zabbix-tests/partitioning/README.md
Normal file
36
zabbix-tests/partitioning/README.md
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# Zabbix Partitioning Tests
|
||||||
|
|
||||||
|
This directory contains a Docker-based test environment for the Zabbix Partitioning script.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
- Docker & Docker Compose
|
||||||
|
- Python 3
|
||||||
|
|
||||||
|
## Setup & Run
|
||||||
|
1. Start the database container:
|
||||||
|
```bash
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
This will start a MySQL 8.0 container and import the Zabbix schema.
|
||||||
|
|
||||||
|
2. Create valid config (done automatically):
|
||||||
|
The `test_config.yaml` references the running container.
|
||||||
|
|
||||||
|
3. Run the partitioning script:
|
||||||
|
```bash
|
||||||
|
# Create virtual environment if needed
|
||||||
|
python3 -m venv venv
|
||||||
|
./venv/bin/pip install pymysql pyyaml
|
||||||
|
|
||||||
|
# Dry Run
|
||||||
|
./venv/bin/python3 ../../partitioning/zabbix_partitioning.py -c test_config.yaml --dry-run --init
|
||||||
|
|
||||||
|
# Live Run
|
||||||
|
./venv/bin/python3 ../../partitioning/zabbix_partitioning.py -c test_config.yaml --init
|
||||||
|
```
|
||||||
|
|
||||||
|
## Cleanup
|
||||||
|
```bash
|
||||||
|
docker compose down
|
||||||
|
rm -rf venv
|
||||||
|
```
|
||||||
14
zabbix-tests/partitioning/docker-compose.yml
Normal file
14
zabbix-tests/partitioning/docker-compose.yml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
services:
|
||||||
|
zabbix-db:
|
||||||
|
image: mysql:8.0
|
||||||
|
container_name: zabbix-partition-test
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: root_password
|
||||||
|
MYSQL_DATABASE: zabbix
|
||||||
|
MYSQL_USER: zbx_part
|
||||||
|
MYSQL_PASSWORD: zbx_password
|
||||||
|
volumes:
|
||||||
|
- ../../partitioning/schemas/70-schema-mysql.txt:/docker-entrypoint-initdb.d/schema.sql
|
||||||
|
ports:
|
||||||
|
- "33060:3306"
|
||||||
|
command: --default-authentication-plugin=mysql_native_password
|
||||||
31
zabbix-tests/partitioning/find_tables.py
Normal file
31
zabbix-tests/partitioning/find_tables.py
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import re
|
||||||
|
|
||||||
|
def get_partitionable_tables(schema_path):
|
||||||
|
with open(schema_path, 'r', encoding='utf-8', errors='ignore') as f:
|
||||||
|
content = f.read()
|
||||||
|
|
||||||
|
# Split into CREATE TABLE statements
|
||||||
|
tables = content.split('CREATE TABLE')
|
||||||
|
valid_tables = []
|
||||||
|
|
||||||
|
for table_def in tables:
|
||||||
|
# Extract table name
|
||||||
|
name_match = re.search(r'`(\w+)`', table_def)
|
||||||
|
if not name_match:
|
||||||
|
continue
|
||||||
|
table_name = name_match.group(1)
|
||||||
|
|
||||||
|
# Check for PRIMARY KEY definition
|
||||||
|
pk_match = re.search(r'PRIMARY KEY \((.*?)\)', table_def, re.DOTALL)
|
||||||
|
if pk_match:
|
||||||
|
pk_cols = pk_match.group(1)
|
||||||
|
if 'clock' in pk_cols:
|
||||||
|
valid_tables.append(table_name)
|
||||||
|
|
||||||
|
return valid_tables
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
tables = get_partitionable_tables('/opt/git/Zabbix/partitioning/70-schema-mysql.txt')
|
||||||
|
print("Partitionable tables (PK contains 'clock'):")
|
||||||
|
for t in tables:
|
||||||
|
print(f" - {t}")
|
||||||
25
zabbix-tests/partitioning/test_config.yaml
Normal file
25
zabbix-tests/partitioning/test_config.yaml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
database:
|
||||||
|
type: mysql
|
||||||
|
host: 127.0.0.1
|
||||||
|
socket:
|
||||||
|
user: root
|
||||||
|
passwd: root_password
|
||||||
|
db: zabbix
|
||||||
|
# Port mapping in docker-compose is 33060
|
||||||
|
port: 33060
|
||||||
|
|
||||||
|
partitions:
|
||||||
|
daily:
|
||||||
|
- history: 7d
|
||||||
|
- history_uint: 7d
|
||||||
|
- history_str: 7d
|
||||||
|
- history_log: 7d
|
||||||
|
- history_text: 7d
|
||||||
|
- history_bin: 7d
|
||||||
|
- trends: 365d
|
||||||
|
- trends_uint: 365d
|
||||||
|
|
||||||
|
logging: console
|
||||||
|
premake: 2
|
||||||
|
replicate_sql: False
|
||||||
|
initial_partitioning_start: retention
|
||||||
25
zabbix-tests/partitioning/wait_for_db.py
Normal file
25
zabbix-tests/partitioning/wait_for_db.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import time
|
||||||
|
import pymysql
|
||||||
|
import sys
|
||||||
|
|
||||||
|
config = {
|
||||||
|
'host': '127.0.0.1',
|
||||||
|
'port': 33060,
|
||||||
|
'user': 'root',
|
||||||
|
'password': 'root_password',
|
||||||
|
'database': 'zabbix'
|
||||||
|
}
|
||||||
|
|
||||||
|
max_retries = 90
|
||||||
|
for i in range(max_retries):
|
||||||
|
try:
|
||||||
|
conn = pymysql.connect(**config)
|
||||||
|
print("Database is ready!")
|
||||||
|
conn.close()
|
||||||
|
sys.exit(0)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Waiting for DB... ({e})")
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
print("Timeout waiting for DB")
|
||||||
|
sys.exit(1)
|
||||||
Reference in New Issue
Block a user