Тестування – це невід'ємна частина процесу розробки. І іноді розробникам потрібно запустити тести локально до того моменту комміту змін.
Якщо програма використовує Amazon Web Services, пітон бібліотека мото ідеально для цього підходить.
Повний список покриття ресурсів можна переглянути
На Github є ріпа Hugo Picado -
Що ж, це досить просто виправити.
Оскільки під час запуску необхідно вказати тип сервісу (env змінної MOTO_SERVICE), нам залишається описати створення ресурсу.
Трохи змінимо початок.ш:
замість
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
Вставляємо:
if [ -f /opt/init/bootstrap.py ]; then
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT & (sleep 5 && echo "Executing bootstrap script." && python /opt/init/bootstrap.py)
else
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
fi
wait
Підсумковий файл виходить:
початок.ш
#!/bin/sh
# validate required input
if [ -z "$MOTO_SERVICE" ]; then
echo "Please define AWS service to run with Moto Server (e.g. s3, ec2, etc)"
exit 1
fi
# setting defaults for optional input
if [ -z "$MOTO_HOST" ]; then
MOTO_HOST="0.0.0.0"
fi
if [ -z "$MOTO_PORT" ]; then
MOTO_PORT="5000"
fi
echo "Starting service $MOTO_SERVICE at $MOTO_HOST:$MOTO_PORT"
if [ -f /opt/init/bootstrap.py ]; then
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT & (sleep 5 && echo "Executing bootstrap script." && python /opt/init/bootstrap.py)
else
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
fi
# Prevent container from exiting when bootstrap.py finishing
wait
Білдимо новий образ і пушимо у свій registre.
Далі, напишемо скрипт ініціалізації ресурсу, наприклад SWF domain, використовуючи бібліотеку для роботи з AWS — boto3:
bootstrap_swf.py
import boto3
from botocore.exceptions import ClientError
import os
os.environ["AWS_ACCESS_KEY_ID"] = "fake"
os.environ["AWS_SECRET_ACCESS_KEY"] = "fake"
client = boto3.client('swf', region_name='us-west-2', endpoint_url='http://localhost:5000')
try:
client.register_domain(
name='test-swf-mock-domain',
description="Test SWF domain",
workflowExecutionRetentionPeriodInDays="10"
)
except ClientError as e:
print "Domain already exists: ", e.response.get("Error", {}).get("Code")
response = client.list_domains(
registrationStatus='REGISTERED',
maximumPageSize=123,
reverseOrder=True|False
)
print 'Ready'
Логіка така:
- Монтуємо при запуску наш скрипт у /opt/init/bootstrap.py.
- Якщо файл вмонтовано, він буде виконаний.
- Якщо файлу немає, просто запуститься голий moto-server.
І, можна мокати цілий ресурс запуском одного контейнера:
docker run --name swf -d
-e MOTO_SERVICE=swf
-e MOTO_HOST=0.0.0.0
-e MOTO_PORT=5000
-p 5001:5000
-v /tmp/bootstrap_swf.py:/opt/init/bootstrap.py
-i awesome-repo.com/moto-server:latest
Пробуємо в інтерактивному режимі:
Працює!
Таким чином, ми можемо зробити docker-compose.yml, який допоможе заощадити час на тестування змін:
докер-компост.імл
version: '3'
services:
s3:
image: picadoh/motocker
environment:
- MOTO_SERVICE=s3
- MOTO_HOST=10.0.1.2
ports:
- "5002:5000"
networks:
motonet:
ipv4_address: 10.0.1.2
volumes:
- /tmp/bootstrap_s3.py:/opt/init/bootstrap.py
swf:
image: picadoh/motocker
environment:
- MOTO_SERVICE=swf
- MOTO_HOST=10.0.1.3
ports:
- "5001:5000"
networks:
motonet:
ipv4_address: 10.0.1.3
volumes:
- /tmp/bootstrap_swf.py:/opt/init/bootstrap.py
ec2:
image: picadoh/motocker
environment:
- MOTO_SERVICE=ec2
- MOTO_HOST=10.0.1.4
ports:
- "5003:5000"
networks:
motonet:
ipv4_address: 10.0.1.4
volumes:
- /tmp/bootstrap_ec2.py:/opt/init/bootstrap.py
networks:
motonet:
driver: bridge
ipam:
config:
- subnet: 10.0.0.0/16
Власне, не тільки на ноутбуці розробника можна використовувати такий підхід. Попередні тести з моками після збирання допоможуть позбутися можливих проблем при запуску на dev* оточеннях.
Посилання:
Motocker repo
Moto repo
Boto3 Docs
Джерело: habr.com