#!/bin/sh # SPDX-License-Identifier: MIT # Copyright (C) 2026 Bryan Joshua Pedini set -eu image=$1 version=$2 output=$(docker run --rm "$image" -plugins) printf '%s\n' "$output" | grep -qx 'mysql' docker run --rm "$image" -version | grep -F "CoreDNS-${version}" network="coredns-ci-$$" db="coredns-db-$$" dns="coredns-dns-$$" config=$(mktemp) cleanup() { docker rm -f "$dns" "$db" >/dev/null 2>&1 || true docker network rm "$network" >/dev/null 2>&1 || true rm -f "$config" } trap cleanup EXIT INT TERM docker network create --internal "$network" >/dev/null docker run -d --name "$db" --network "$network" --network-alias database -e MARIADB_ROOT_PASSWORD=test -e MARIADB_DATABASE=coredns mariadb:11 >/dev/null ready=0 attempt=0 while [ "$attempt" -lt 60 ]; do attempt=$((attempt + 1)) if docker exec "$db" mariadb -uroot -ptest -e 'SELECT 1' >/dev/null 2>&1; then ready=1; break; fi sleep 1 done [ "$ready" = 1 ] || { docker logs "$db"; exit 1; } docker exec -i "$db" mariadb -uroot -ptest coredns <<'SQL' CREATE TABLE coredns_records (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, zone VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, ttl INT DEFAULT NULL, content TEXT, record_type VARCHAR(255) NOT NULL); INSERT INTO coredns_records (zone, name, ttl, content, record_type) VALUES ('example.test.', 'www', 30, '{"ip":"192.0.2.10"}', 'A'); SQL printf '%s\n' '.:1053 {' ' mysql {' ' dsn root:test@tcp(database:3306)/coredns' ' }' ' errors' '}' > "$config" docker create --name "$dns" --network "$network" --network-alias dns "$image" -conf /Corefile >/dev/null docker cp "$config" "$dns:/Corefile" docker start "$dns" >/dev/null docker run --rm --network "$network" python:3.13-slim python -c ' import socket, struct, time query = bytes.fromhex("123401000001000000000000") + b"\x03www\x07example\x04test\0" + struct.pack("!HH", 1, 1) for attempt in range(30): try: with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock: sock.settimeout(1) sock.sendto(query, ("dns", 1053)) response, _ = sock.recvfrom(4096) if response[:2] == b"\x12\x34" and response[3] & 15 == 0 and struct.unpack("!H", response[6:8])[0] and b"\xc0\x00\x02\x0a" in response: print("MySQL-backed DNS query passed") break except OSError: pass time.sleep(1) else: raise SystemExit("MySQL-backed DNS query failed") '