Testování je nedílnou součástí vývojového procesu. A někdy musí vývojáři před provedením změn provést testy lokálně.
Pokud aplikace používá Amazon Web Services, krajta библиотека moto ideální pro toto.
Můžete si prohlédnout úplný seznam pokrytí zdrojů
Na Githubu je tuřín Hugo Picado -
No, to je dost snadné napravit.
Protože při spouštění musíte určit typ služby (env proměnná MOTO_SERVICE), musíme jen popsat vytvoření zdroje.
Pojďme to trochu změnit start.sh:
Místo toho
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
Vložit:
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
Konečný soubor je:
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
Vytvoříme novou image a vložíme ji do našeho registru.
Dále napíšeme například inicializační skript prostředku doména SWF, pomocí knihovny pro práci s 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'
Logika je tato:
- Při spuštění připojíme náš skript /opt/init/bootstrap.py.
- Pokud je soubor připojen, bude spuštěn.
- Pokud neexistuje žádný soubor, jednoduše se spustí holý moto-server.
A můžete zesměšnit celý zdroj spuštěním jednoho kontejneru:
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
Zkusme to interaktivně:
Funguje to!
Můžeme tedy vytvořit docker-compose.yml, což ušetří čas při testování změn:
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
Ve skutečnosti lze tento přístup použít nejen na vývojářském notebooku. Předběžné testy s maketami po sestavení pomohou zbavit se možných problémů při běhu v prostředích dev*.
Odkazy:
Motocker repo -
Moto repo -
Dokumenty Boto3 -
Zdroj: www.habr.com