Alumno: Joaquin Andresen
Padrón: 102707
Se pide generar un script en bash llamado generar-compose.sh que permita generar un nuevo archivo .yaml que contenga una definición de Docker Compose con un servidor y una N cantidad de clientes.
El script generar-compose.sh llama a mi-generador.py, el cual se encarga de generar el archivo .yaml. Este consistira un servidor, N cantidad de clientes y una network.
Si es necesario, este script se actualizara en futuros ejercicios.
Antes de ejecutar el script, debemos asegurarnos que nuestro usuario tenga permisos suficientes para ejecutarlo, utilizando
chmod.
Para ejecutar el script debemos utilizar el siguiente comando:
./generar-compose.sh <archivo_de_salida> N
Por ejemplo:
./generar-compose.sh docker-compose-dev.yaml 5
Luego de generar la definición de Docker Compose, podemos levantar todo utilizando el siguiente comando:
make docker-compose-up
Se pide modificar el Client y el Server para poder persistir los archivos de configuración fuera de la imagen.
Se utilizaron volumenes dentro de la definición de Docker Compose, para indicar que archivos debian persistirse.
Caso Server:
volumes:
- ./server/config.ini:/config.ini
Caso Client:
volumes:
- ./client/config.yaml:/config.yaml
Dado que los programas priorizan las variables de entorno por sobre las variables de configuración, se decidio eliminar las variables de entorno de la definición de Docker Compose para este ejercicio.
Primero generamos la nueva definición de Docker compose:
./generar-compose.sh docker-compose-dev.yaml 5
Luego levantamos todo utilizando el siguiente comando:
make docker-compose-up
Para este ejercicio, se genero un script en bash llamado validar-echo-server.sh que verifica la comunicación con el Server utilizando netcat.
Para esto, el script levanta un nuevo container en Docker dentro de la misma red que el Server, y ejecuta el siguiente comando:
echo 'hello' | nc server 12345
Luego, comprueba que la respuesta sea igual al mensaje envia y muestra el log correspondiente.
Generamos la definición de Docker compose:
./generar-compose.sh docker-compose-dev.yaml 5
Levantamos todo utilizando el siguiente comando:
make docker-compose-up
Finalmente ejecutamos el script validador:
./validar-echo-server.sh
Antes de ejecutar el script, debemos asegurarnos que nuestro usuario tenga permisos suficientes para ejecutarlo, utilizando
chmod.
Se modificó el código para que los Client y el Server finalicen al recibir la señal SIGTERM.
Para los Client se utilzaron las librería os/signal y syscall que nos permiten recibir la señal SIGTERM y almacenarla en una variable. Luego, dentro del loop se comprueba si la señal fue recibida y finaliza el programa.
Generamos la definición de Docker compose:
./generar-compose.sh docker-compose-dev.yaml 5
Levantamos todo utilizando el siguiente comando:
make docker-compose-up
Para enviar la señal SIGTERM podemos utilizar el siguiente comando:
docker compose -f docker-compose-dev.yaml stop -t 10
Se modificaron el Client y el Server para implementar el envío y recepción de apuestas.
El Client tendrá los datos de la apuesta definidos como variables de entorno:
- NOMBRE
- APELLIDO
- DOCUMENTO
- NACIMIENTO
- NUMERO
Al ejecutarse, se tomaran estos y se enviaran al Server utilizando el protocolo que se explicara en la siguiente sección.
El Server recibira la apuesta y la almacenara en un archivo csv utilizando la función store_bets
Si el Cliente quiere enviar un mensaje al Server, debera enviarle dos mensajes. El primero indicando la longitud del siguiente, y el segundo con el contenido que se desea enviar.
Los mensajes que contengan apuestas tendrán el siguiente formato
ID AGENCIA,NOMBRE,APELLIDO,DOCUMENTO,NACIMIENTO,NUMERO
La respuesta del Server en caso de recibir correctamente el mensaje será reenviar los siguientes datos:
DOCUMENTO,NACIMIENTO
De esta manera el Client podrá confirmar que el Server recibir los datos correctamente.
Si el Client no recibe una respuesta o los datos no coinciden, arrojara un error y finalizara.
Generamos la definición de Docker compose:
./generar-compose.sh docker-compose-dev.yaml 5
Levantamos todo utilizando el siguiente comando:
make docker-compose-up
Se modificaron los Client para que puedan enviar varias apuestas a la vez. Estas apuestas se leen a partir de un archivo .csv que es persistido utilizando volumenes.
Los Client enviaran una cierta cantidad de apuestas por mensaje (batch). La cantidad de mensajes estara determinada por el valor maxAmount dentro del archivo de configuración.
El Server recibira estas apuestas y las guardará utilizando la función store_bets al igual que en el ejercicio anterior.
Se realizaron las siguientes modificaciones al protocolo para lograr un correcto funcionamiento:
- Las apuestas se enviaran con el mismo formato del ejercicio 5, con el agregado de que dentro de un batch estarán separadas por un
;
ID AGENCIA,NOMBRE1,APELLIDO1,DOCUMENTO1,NACIMIENTO1,NUMERO1;
ID AGENCIA,NOMBRE2,APELLIDO2,DOCUMENTO2,NACIMIENTO2,NUMERO2;
ID AGENCIA,NOMBRE3,APELLIDO3,DOCUMENTO3,NACIMIENTO3,NUMERO3
-
Cuando un
Clienttermina de enviar todas sus apuestas, envía un último mensaje con la palabraFINISHpara indicarle alServerque ya no va a recibir más apuestas -
Una vez procesadas todas las apuestas y recibido el mensaje
FINISH, elServerle enviara un último mensaje a cadaClientcon la cantidad de apuestas que recibió y este último podrá utilizar ese dato para determinar si todas las apuestas fueron enviadas o si se perdió alguna
Generamos la definición de Docker compose:
./generar-compose.sh docker-compose-dev.yaml 5
Levantamos todo utilizando el siguiente comando:
make docker-compose-up
Se realizan modificaciones para que al finalizar el envia de las apuestas de todos los Client, estos puedan consultar los ganadores.
Cuando el Server recibe el mensaje FINISH de cada Client, se habilita la realización del sorteo utilizando las funciones load_bets y has_won.
El sorteo se realiza una sola vez y los resultados se guardan en una variable del Server para que pueda ser consultado por varios Client sin tener que realizar el proceso del sorteo múltiples veces.
Se realizaron las siguientes modificaciones al protocolo para lograr un correcto funcionamiento:
- Se agregan dos mensajes para inicializar procesos.
BETlo envia unClientpara indicarle alServerque va a empezar a recibir las apuestas.RESULTSlo envia unClientpara indicarle alServerque quiere obtener los resultados del sorteo, seguido de su ID para que elServersepa que agencia es- Si todos los
Clientenviaron el mensajeFINISH, al recibir el primerRESULTSelServerrealizara el sorteo y le enviara los documentos de los ganadores de su agencia alClientcon el siguiente formato
DOCUMENTO1,DOCUMENTO2,DOCUMENTO3,DOCUMENTO4
-
Si nunguna de las apuestas de la agencia resultó ganadores, el
Serverle enviará el mensajeNOWINNERS -
Si el
Servertodavía no recibió el mensajeFINISHde todos losClient, entonces no va a responder ningun mensaje deRESULTS. Por lo cual, losClientdeberán reintentar hasta conseguir una respuesta, realizando un sleep que se incrementara en cada iteración.
Generamos la definición de Docker compose:
./generar-compose.sh docker-compose-dev.yaml 5
Levantamos todo utilizando el siguiente comando:
make docker-compose-up
Se modificó el Server para que pueda procesar multiples mensajes al mismo tiempo. Se agrego un mensaje extra llamado ERROR para que el Server le pueda avisar al Client que ocurrio un error internamente.
Se utilizo la librería threading para generar un thread por cada connexión.
Para evitar condiciones de carrera se implementaron locks para el contador de Client que enviaron el mensaje FINISH y otro para utilizar la función store_bets.
Generamos la definición de Docker compose:
./generar-compose.sh docker-compose-dev.yaml 5
Levantamos todo utilizando el siguiente comando:
make docker-compose-up