Migrate test script from shell to python

- test.py needs to be called with 2 arguments : test_name and timeout
  - it will cd to test_name dir and use the test_name.yml from there
  - it will sleep for an amount of time equals to timeout in minutes
- it will perform health checks for containers. If healtcheck isn't enabled will check for running state
- it will run hooks inside the test_name dir ( .py and .sh) if there are any
- printing logs in any case
master
Ionut Filip 6 years ago
parent 238d4e7f20
commit 3b1fdc6166

@ -6,12 +6,17 @@ addons:
- docker-ce - docker-ce
env: env:
- VERSION=$TRAVIS_BRANCH - VERSION=$TRAVIS_BRANCH
language: python
python:
- "3.6"
install:
- pip install -r tests/requirements.txt
script: script:
# Default to mailu for DOCKER_ORG # Default to mailu for DOCKER_ORG
- if [ -z "$DOCKER_ORG" ]; then export DOCKER_ORG="mailu"; fi - if [ -z "$DOCKER_ORG" ]; then export DOCKER_ORG="mailu"; fi
- docker-compose -f tests/build.yml build - docker-compose -f tests/build.yml build
- tests/compose/test-script.sh - python tests/compose/test.py
deploy: deploy:
provider: script provider: script

@ -66,7 +66,15 @@ services:
- front - front
# Optional services # Optional services
antispam:
image: mailu/rspamd:master
env_file: mailu.env
volumes:
- "/mailu/filter:/var/lib/rspamd"
- "/mailu/dkim:/dkim"
- "/mailu/overrides/rspamd:/etc/rspamd/override.d"
depends_on:
- front

@ -0,0 +1,92 @@
import sys
import os
import time
import docker
from colorama import Fore, Style
# Declare variables for service name and sleep time
test_name=sys.argv[1]
timeout=int(sys.argv[2])
client = docker.APIClient(base_url='unix://var/run/docker.sock')
containers = []
# Start up containers
def start():
os.system("cp mailu.env " + test_name + "/")
os.system("docker-compose -f " + test_name + "/" + test_name + ".yml -p $DOCKER_ORG up -d ")
# Stop containers
def stop(exit_code):
print_logs()
os.system("docker-compose -f " + test_name + "/" + test_name + ".yml -p $DOCKER_ORG down")
os.system("rm " + test_name +"/mailu.env")
sys.exit(exit_code)
# Sleep for a defined amount of time
def sleep():
print(Fore.LIGHTMAGENTA_EX + "Sleeping for " + str(timeout) + "m" + Style.RESET_ALL)
time.sleep(timeout*60)
def health_checks():
exit_code = 0
#Iterating trough all containers dictionary
for container in client.containers(all=True):
#Perform "docker container inspect" on container based on container ID and save output to a dictionary
container_inspect = client.inspect_container(container['Id']) #Dict
if "Health" in container_inspect['State'].keys():
if container_inspect['State']['Health']['Status'] == "healthy":
print(Fore.GREEN + "Health status for " + container_inspect['Name'].replace("/", "") + " : " + Fore.CYAN + container_inspect['State']['Health']['Status'] + Style.RESET_ALL)
if container_inspect['State']['Health']['Status'] != "healthy":
print(Fore.RED + "Container " + container_inspect['Name'].replace("/", "") + " is " + Fore.YELLOW + container_inspect['State']['Health']['Status']
+ Fore.RED + ", FailingStreak: " + Fore.YELLOW + str(container_inspect['State']['Health']['FailingStreak'])
+ Fore.RED + ", Log: " + Fore.YELLOW + str(container_inspect['State']['Health']['Log']) + Style.RESET_ALL)
exit_code = 1
else:
if container_inspect['State']['Status'] == "running":
print(Fore.GREEN + "Running status for " + container_inspect['Name'].replace("/", "") + " : " + Fore.BLUE + container_inspect['State']['Status'] + Style.RESET_ALL)
if container_inspect['State']['Status'] != "running":
print(Fore.RED + "Container " + container_inspect['Name'].replace("/", "") + " state is: " + Fore.YELLOW + container_inspect['State']['Status'] + Style.RESET_ALL)
exit_code = 1
#Saving Id, Name and state to a new dictionary
containers_dict = {}
containers_dict['Name'] = container_inspect['Name'].replace("/", "")
containers_dict['Id'] = container_inspect['Id']
containers_dict['State'] = container_inspect['State']
#Adding the generated dictionary to a list
containers.append(containers_dict)
if exit_code != 0:
stop(exit_code)
def print_logs():
print("Printing logs ...")
#Iterating through docker container inspect list and print logs
for container in containers:
print(Fore.LIGHTMAGENTA_EX + "Printing logs for: " + Fore.GREEN + container['Name'] + Style.RESET_ALL)
os.system('docker container logs ' + container['Name'])
#Iterating over hooks in test folder and running them
def hooks():
print("Running hooks")
for test_file in sorted(os.listdir(test_name + "/")):
if test_file.endswith(".py"):
os.system("python3 " + test_name + "/" + test_file)
elif test_file.endswith(".sh"):
os.system("./" + test_name + "/" + test_file)
start()
print()
sleep()
print()
os.system("docker ps -a")
print()
health_checks()
print()
hooks()
print()
stop(0)

@ -0,0 +1,2 @@
docker
colorama
Loading…
Cancel
Save