Тестрането е неразривна част от процеса на разработка. Понякога разработчиците трябва да стартират тестовете локално, преди да ангажират промените.
Ако приложението използва Amazon Web Services, python библиотека moto перфектно отговаря на това.

Пълен списък с покритие на ресурсите можете да видите .
На Github има репо Hugo Picado — . Готов образ, стартирайте и използвайте. Единственото объркване е, че след стартиране няма AWS ресурси там все още не са създадени.
Е, това е доста лесно да се поправи.
Тъй като трябва да зададете типа на услугата при стартиране (env променливата MOTO_SERVICE), остава само да опишем създаването на ресурса.
Нека променим малко start.sh:
Вместо
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 "Изпълнение на скрипта за стартиране." && python /opt/init/bootstrap.py)
else
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
fi
wait
Крайният файл изглежда така:
start.sh
#!/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Създаваме нов образ и го пускаме в собственото си хранилище.
След това ще напишем скрипт за инициализация на ресурса, например SWF домейн, използвайки библиотеката за работа с 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="Тестов SWF домейн",
workflowExecutionRetentionPeriodInDays="10"
)
except ClientError as e:
print "Домейнът вече съществува: ", e.response.get("Error", {}).get("Code")
response = client.list_domains(
registrationStatus='REGISTERED',
maximumPageSize=123,
reverseOrder=True|False
)
print 'Готов'
Логиката е следната:
- Монтираме нашия скрипт при стартиране в /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, който ще помогне за спестяване на време при тестването на промените:
docker-compose.yml
версия: '3'
услуги:
s3:
изображение: picadoh/motocker
окружение:
- MOTO_SERVICE=s3
- MOTO_HOST=10.0.1.2
порты:
- "5002:5000"
сети:
motonet:
ipv4_address: 10.0.1.2
тома:
- /tmp/bootstrap_s3.py:/opt/init/bootstrap.py
swf:
изображение: picadoh/motocker
окружение:
- MOTO_SERVICE=swf
- MOTO_HOST=10.0.1.3
порты:
- "5001:5000"
сети:
motonet:
ipv4_address: 10.0.1.3
тома:
- /tmp/bootstrap_swf.py:/opt/init/bootstrap.py
ec2:
изображение: picadoh/motocker
окружение:
- MOTO_SERVICE=ec2
- MOTO_HOST=10.0.1.4
порты:
- "5003:5000"
сети:
motonet:
ipv4_address: 10.0.1.4
тома:
- /tmp/bootstrap_ec2.py:/opt/init/bootstrap.py
сети:
motonet:
драйвер: bridge
ipam:
конфигурация:
- подсеть: 10.0.0.0/16
Всъщност, такъв подход може да се използва не само на лаптопа на разработчика. Предварителните тестове с мокове след сборка ще помогнат да се избегнат евентуални проблеми при стартиране в dev* среди.
Връзки:
Repo на Motocker —
Repo на Moto —
Документация на Boto3 —
Източник: habr.com
