La prueba es una parte integral del proceso de desarrollo. A veces, los desarrolladores necesitan ejecutar pruebas localmente antes de realizar el commit de los cambios.
Si la aplicación utiliza Amazon Web Services, python biblioteca moto es ideal para esto.

Puedes ver la lista completa de recursos .
Hay un repositorio en Github Hugo Picado — . Imagen lista, solo ejecuta y usa. El único detalle es que después de iniciar, no hay AWS recursos creados todavía.
Bueno, eso es bastante fácil de solucionar.
Dado que al iniciar es necesario especificar el tipo de servicio (env variable MOTO_SERVICE), solo nos queda describir la creación del recurso.
Modificamos un poco start.sh:
En lugar de
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
Insertamos:
if [ -f /opt/init/bootstrap.py ]; then
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT & (sleep 5 && echo "Ejecutando script de inicio." && python /opt/init/bootstrap.py)
else
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
fi
wait
El archivo final queda así:
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
waitConstruimos una nueva imagen y la subimos a nuestro registro.
A continuación, escribiré un script para la inicialización del recurso, por ejemplo, dominio SWF, utilizando la biblioteca para trabajar con AWS — boto3:
bootstrap_swf.py
import boto3
from botocore.exceptions import ClientError
import os
os.environ["AWS_ACCESS_KEY_ID"] = "falso"
os.environ["AWS_SECRET_ACCESS_KEY"] = "falso"
client = boto3.client('swf', region_name='us-west-2', endpoint_url='http://localhost:5000')
try:
client.register_domain(
name='test-swf-mock-domain',
description="Dominio SWF de prueba",
workflowExecutionRetentionPeriodInDays="10"
)
except ClientError as e:
print "El dominio ya existe: ", e.response.get("Error", {}).get("Code")
response = client.list_domains(
registrationStatus='REGISTERED',
maximumPageSize=123,
reverseOrder=True|False
)
print 'Listo'
La lógica es la siguiente:
- Montamos nuestro script al iniciar /opt/init/bootstrap.py.
- Si el archivo está montado, se ejecutará.
- Si no hay archivo, simplemente se iniciará el moto-server vacío.
Y se puede simular un recurso completo iniciando un solo contenedor:
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
Probamos en modo interactivo:

¡Funciona!
Así, podemos crear un docker-compose.yml, que ayudará a ahorrar tiempo en las pruebas de cambios:
docker-compose.yml
versión: '3'
servicios:
s3:
imagen: picadoh/motocker
entorno:
- MOTO_SERVICE=s3
- MOTO_HOST=10.0.1.2
puertos:
- "5002:5000"
redes:
motonet:
ipv4_address: 10.0.1.2
volúmenes:
- /tmp/bootstrap_s3.py:/opt/init/bootstrap.py
swf:
imagen: picadoh/motocker
entorno:
- MOTO_SERVICE=swf
- MOTO_HOST=10.0.1.3
puertos:
- "5001:5000"
redes:
motonet:
ipv4_address: 10.0.1.3
volúmenes:
- /tmp/bootstrap_swf.py:/opt/init/bootstrap.py
ec2:
imagen: picadoh/motocker
entorno:
- MOTO_SERVICE=ec2
- MOTO_HOST=10.0.1.4
puertos:
- "5003:5000"
redes:
motonet:
ipv4_address: 10.0.1.4
volúmenes:
- /tmp/bootstrap_ec2.py:/opt/init/bootstrap.py
redes:
motonet:
controlador: bridge
ipam:
configuración:
- subnet: 10.0.0.0/16
De hecho, este enfoque no solo se puede utilizar en la computadora portátil del desarrollador. Las pruebas preliminares con mocks después de la construcción ayudarán a eliminar posibles problemas al lanzarse en entornos dev*.
Enlaces:
Repositorio de Motocker —
Repositorio de Moto —
Documentación de Boto3 —
Fuente: habr.com
