Testovanie je neoddeliteľnou súčasťou procesu vývoja. A niekedy potrebujú vývojári spustiť testy lokálne pred tým, ako zmeny odovzdajú.
Ak aplikácia používa Amazon Web Services, python knižnice moto je na to ideálne.

Úplný zoznam pokrytia zdrojov si môžete pozrieť .
Na Githube je repozitár Hugo Picado — . Hotový obraz, spustiť a používať. Jediný problém je, že po spustení tam ešte nie sú vytvorené žiadne AWS zdroje.
No, to sa dá celkom jednoducho opraviť.
Keďže pri spustení je potrebné zadať typ služby (env premenná MOTO_SERVICE), zostáva nám popísať vytvorenie zdroja.
Trochu zmeníme start.sh:
Namiesto
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
Vkladáme:
if [ -f /opt/init/bootstrap.py ]; then
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT & (sleep 5 && echo "Spúšťam bootstrap skript." && python /opt/init/bootstrap.py)
else
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
fi
wait
Konečný súbor 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
waitVytvárame nový obraz a nahráme ho do svojho registry.
Ďalej napíšeme skript na inicializáciu zdroja, napríklad SWF domain, pomocou knižnice na prácu 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 "Doména už existuje: ", e.response.get("Error", {}).get("Code")
response = client.list_domains(
registrationStatus='REGISTERED',
maximumPageSize=123,
reverseOrder=True|False
)
print 'Pripravené'
Logika je taká:
- Pripojíme náš skript pri spustení /opt/init/bootstrap.py.
- Ak je súbor pripojený — bude vykonaný.
- Ak súbor neexistuje — jednoducho sa spustí čistý moto-server.
A môžeme mockovať celý zdroj spustením jedného kontajnera:
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
Skúšame v interaktívnom režime:

Funguje!
Takto môžeme vytvoriť docker-compose.yml, ktorý pomôže ušetriť čas na testovanie zmien:
docker-compose.yml
verzia: '3'
služby:
s3:
obrázok: picadoh/motocker
prostredie:
- MOTO_SERVICE=s3
- MOTO_HOST=10.0.1.2
porty:
- "5002:5000"
siete:
motonet:
ipv4_adresa: 10.0.1.2
objemy:
- /tmp/bootstrap_s3.py:/opt/init/bootstrap.py
swf:
obrázok: picadoh/motocker
prostredie:
- MOTO_SERVICE=swf
- MOTO_HOST=10.0.1.3
porty:
- "5001:5000"
siete:
motonet:
ipv4_adresa: 10.0.1.3
objemy:
- /tmp/bootstrap_swf.py:/opt/init/bootstrap.py
ec2:
obrázok: picadoh/motocker
prostredie:
- MOTO_SERVICE=ec2
- MOTO_HOST=10.0.1.4
porty:
- "5003:5000"
siete:
motonet:
ipv4_adresa: 10.0.1.4
objemy:
- /tmp/bootstrap_ec2.py:/opt/init/bootstrap.py
siete:
motonet:
vodič: bridge
ipam:
konfigurácia:
- podsieť: 10.0.0.0/16
Súčasne, tento prístup nie je obmedzený len na počítač vývojára. Predbežné testy s mockami po zostavení pomôžu zbaviť sa možných problémov pri spúšťaní na dev* prostrediach.
Odkazy:
Motocker repo —
Moto repo —
Boto3 Docs —
Zdroj: habr.com
