# Microservicio Fortanix

Desarrollado para el consumo del API de [Fortanix DSM](https://amer.smartkey.io/#/) en la administración de Llaves (Licencias).

## Descripción Breve

El servidor consta de 4 metodos implementados:

- **CreateUser**: Recibe como parametros un *correo* y un *group_id* en formato UUID para la invitación del usuario a formar parte de la organización **Triara** en grupos separados.
- **CreateGroup**: Recibe como parametro el nombre del del Grupo a generar, actua como identificador unico.
- **DeleteUser**: Recibe como parametro el *user_id* en formato UUID.
- **GetAppsCountGroup**: Recibe como parametro el *group_id* en formato UUID, retorna el conteo de aplicaciones por grupo, necesarias para la facturación.

## Ejecución Local

**\*Ubicarse el en directorio de trabajo del proyecto\***

### SERVER

Para la ejecución local es necesario generar los certificados necesaros para habilitar la comunicación TLS. 
Primeramente es necesario contar con los certificados raiz (**pem y key**), en caso de tenerlos saltar al siguinte paso, en caso de no tenerlos, se pueden generar con el siguiente comando:
```sh
openssl req -x509 -nodes -newkey rsa:4096 -keyout ca.key -out ca.pem -subj /O=me
```
Posteriormente es necesario generar los certificados que utilizará el servidor para la encripción de la comunicación mediante TLS, estos se generan con los siguientes comandos:
```sh
# El parametro CN dede de incluir el DNS a utilizar ya sea que se resuelva por el servidor
# o se encuentre dentro del archivo host
openssl req -nodes -newkey rsa:4096 -keyout server.key -out server.csr -subj /CN=localhost
openssl x509 -req -in server.csr -CA ca.pem -CAkey ca.key -set_serial 1 -out server.pem
```
Una vez generados los certificados podemos ejecutar el servidor.
```sh
python server.py
```

### CLIENT

Para ejecutar el cliente necesitamos el certificado raiz, unicamente el certificado sin la llave, para poder hacer la verificación los certificados del servidor. La ejecución del cliente se realiza de la siguiente manera:
```sh
python client.py
```

Este realizara la ejecución de prueba, creando un grupo ya existente, invitando a un usuario a formar parte de la organización, eliminando al usuario recien invitado y por ultimo retornal el total de aplicaciones del grupo **vcdstg**.

## Ejecución Contenedores (*DOCKER*)

**\*Ubicarse el en directorio de trabajo del proyecto\***

Para la ejecución en docker, se han incluido los archivos *Dockerfile* del **server** y del **client** para su contrucción en docker, ambos con parametros a modificar para su correcto funcionamiento.

Para el servidor utilizaremos el modulo de *BuildX* de docker con el siguiente comando:
```sh
docker buildx build . -f server.Dockerfile \
-t [NameOfImage] --secret id=ca.key,src=ca.key
```

Generamos un entorno de red llamado **microservices** para la comunicación exclusiva del cliente y del servidor.
```sh
docker network create microservices
``` 

Realizaremos la ejecución de un contenedor en base a la imagen construida.
```sh
docker run --network microservices \
--name [NameOfContainerServer] [NameOfImageServer]
``` 

Generaremos la imagen del cliente con el siguiente comando.
```sh
docker build . -f client.Dockerfile -t [NameOfImageClient]
```

Ejecutar la imagen con el parametro correspondiente al container del server.
```sh
docker run --network microservices \ 
--name [NameOfContainerClient] [NameOfImageClient] \
-e "CONSUMER_HOST=[NameOfContainerServer]"
```
Con esto ejecutaremos la prueba y podremos ver el consumo de cada uno de los servicios disponibles asi como su respuesta.