Testiranje je neizostavni deo procesa razvoja. Ponekad programerima treba da pokrenu testove lokalno, pre nego što obave promene.
Ako aplikacija koristi Amazon Web Services, python biblioteka moto odlična je za to.

Potpun spisak pokrivenosti resursa može se pogledati .
Na GitHub-u postoji repozitorijum Hugo Picado — . Spreman imidž, pokreni i koristi. Jedini problem je što nakon pokretanja, nijedan AWS resurs nije još uvek kreiran.
Pa, to je dovoljno lako ispraviti.
Pošto je potrebno odrediti tip usluge prilikom pokretanja (env varijabla MOTO_SERVICE), preostaje nam da opišemo kreiranje resursa.
Malo ćemo promeniti start.sh:
Namesto
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
Ubacujemo:
if [ -f /opt/init/bootstrap.py ]; then
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT & (sleep 5 && echo "Izvršavanje bootstrap skripta." && python /opt/init/bootstrap.py)
else
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
fi
wait
Konačni fajl izgleda ovako:
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
waitGradimo novi imidž i gurnemo ga u naš registry.
Zatim, napisaćemo skript za inicijalizaciju resursa, na primer SWF domen, koristeći biblioteku za rad sa 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 domen",
workflowExecutionRetentionPeriodInDays="10"
)
except ClientError as e:
print "Domen već postoji: ", e.response.get("Error", {}).get("Code")
response = client.list_domains(
registrationStatus='REGISTERED',
maximumPageSize=123,
reverseOrder=True|False
)
print 'Spremno'
Logika je sledeća:
- Montiramo naš skript prilikom pokretanja /opt/init/bootstrap.py.
- Ako je fajl montiran — biće izvršen.
- Ako fajl ne postoji — samo će se pokrenuti prazan moto-server.
I, možemo da umokamo ceo resurs pokretanjem jednog kontejnera:
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
Pokušavamo u interaktivnom režimu:

Radi!
Tako možemo napraviti docker-compose.yml, koji će pomoći da se uštedi vreme na testiranju izmena:
docker-compose.yml
verzija: '3'
servisi:
s3:
slika: picadoh/motocker
okruženje:
- MOTO_SERVICE=s3
- MOTO_HOST=10.0.1.2
portovi:
- "5002:5000"
mreže:
motonet:
ipv4_adresa: 10.0.1.2
volumeni:
- /tmp/bootstrap_s3.py:/opt/init/bootstrap.py
swf:
slika: picadoh/motocker
okruženje:
- MOTO_SERVICE=swf
- MOTO_HOST=10.0.1.3
portovi:
- "5001:5000"
mreže:
motonet:
ipv4_adresa: 10.0.1.3
volumeni:
- /tmp/bootstrap_swf.py:/opt/init/bootstrap.py
ec2:
slika: picadoh/motocker
okruženje:
- MOTO_SERVICE=ec2
- MOTO_HOST=10.0.1.4
portovi:
- "5003:5000"
mreže:
motonet:
ipv4_adresa: 10.0.1.4
volumeni:
- /tmp/bootstrap_ec2.py:/opt/init/bootstrap.py
mreže:
motonet:
drajver: bridge
ipam:
konfiguracija:
- podmreže: 10.0.0.0/16
Ovo se ne može koristiti samo na laptopu developera. Preliminarna testiranja sa mokama nakon izgradnje pomoći će u uklanjanju mogućih problema prilikom pokretanja na dev* okruženjima.
Linkovi:
Motocker repozitorij —
Moto repozitorij —
Boto3 dokumentacija —
Izvor: habr.com
