# Documentación: Ocore y Oggui


## Escenario

Surge la necesidad de crear una imagen a traves de un ordenador al que llamaremos modelo. 
Para ello necesitamos tener un ordenador creado en nuestra base de datos con el que tengamos conexión y con un sistema operativo.

Este es el escenario que se han utilizado para esta demostración:

- **Centro**:
  - Nombre: `Centro Demo`

- **Aula**:
  - Nombre: `Aula Demo`
  - Router IP: ` 192.168.2.1`
  - Máscara de red: `255.255.255.0`

- **Ordenador**:
  - MAC Address: `08:00:27:4F:BE:38`
  - Nombre: `modelo`
  - Dirección IP: `192.168.2.2`

- **Subred**:
  - Dirección: `192.168.2.0`
  - Máscara de red: `255.2555.255.0`
  
- **Imagen**:
  - Nombre: `image-test`
  - Descripción: `imagen de referencia`
  - Tipo: `Linux`
  - Versión: `Ubuntu 24.04`
  - Arquitectura: `x86_64`

- **Repositorio**:
  - Ruta: `/opt/opengnsys/ogrepository/images`
  - IP: `192.168.68.55`

- **ogAgent**:
    - versión: `1.4.5~pre7-1 all`

El objetivo es crear una imagen a partir del ordenador `modelo` con las características especificadas, para mas adelante replicar/clonar en el resto de clientes.

En las siguientes capturas de pantalla, se muestra la disposición de los grupos y clientes en la interfaz grafica de ogGui. 

![Grupos general](./images/groups_general.png "Groups general")
![Grupos clients](./images/groups_clients.png "Groups clients")

La herramienta ogGgui/ogCore nos proporciona una interfaz grafica mediante la cual podremos crear una imagen. En la versión actual, lo haremos a traves de la pestaña "Clientes" dentro del panel de administración de grupos.

## Crear una imagen

 1. **Seleccionar cliente modelo**. Mediante la pestaña de **Clientes** en el panel de administración de grupos, accedemos a las opciones del cliente pulsando en el boton "Visualizar" (el que tiene como icono un ojo).
Esto nos da acceso al panel del cliente donde aparece su informacion general y el estado de las particiones. Arriba a la derecha, aparece un boton con todas las acciones disponibles.


![Client info](./images/client_info.png "Client info")
![Client actions](./images/client_actions.png "Client actions")

2. **Crear imagen**. Pulsamos en el botón "Crear imagen" y rellenamos el formulario con los datos de la imagen que queremos crear. En este caso, los datos son los siguientes:
   - **Nombre canónico**: `image-test`
   - **Imagen creada previamente**: en este caso, lo dejamos en blanco.
   - **Seleccionar partición**: Seleccionamos la particion la cual tiene instalada Ubuntu 24.04.

![Client create image](./images/client_create_image.png "Client create image")

Si todo ha ido bien, la intefaz grafica nos devuelve un mensaje de confirmacion verde, en la esquina inferior derecha. 
Esto quiere decir que el ogAgent ha recibido correctamente la llamada mediante API y está trabajando en la creación de la imagen.

## Comprobar la creación de la imagen

En el panel de administracion de imagenes, podremos ver el estado de la imagen que hemos creado.
  
La herramienta almacena las imagenes mediante diferentes estados, los cuales son:
- **Estados**:
  - En progreso: `in-progress`. La imagen esta en proceso de creación, el ogAgent esta trabajando en ello. 
  - Pendiente de ficheros auxiliares: `aux-files-pending`. La imagen ha sido creada en el repositorio, pero aun no se han generado los archivos auxiliares, ni devuelvo el fullsum (a partir de ahora será el identificador unico asociado)
  - Completada: `success`. La imagen ha sido creada correctamente. Se encuentra en el repositorio de imagenes, y con sus archivos asociados generados satisfactoriamente.
  - Error: `failed`. La imagen no ha podido ser creada, por algun error en el proceso.


![Images](./images/images.png "Images")

Una vez el proceso haya terminado, deberiamos poder ver algo similar a la siguiente imagen:

![Image success](./images/image_success.png "Image success")


## Trazas

Para el correcto funcionamiento del sistema, la comunicacion entre los componentes **ogCore**
, **ogAgent**  y **ogRepository** debe ser asíncrona. Para ello, se utilizan trazas que nos permiten ver el estado de las peticiones y las respuestas.

Podremos acceder a las trazas del sistema, en el botón con un icono de una **campana** en el menu superior de la interfaz grafica.
Se nos oferece un listado con todas las trazas del sistema. Podremos utilizar los filtros proporcionados si es necesario.

![Traces](./images/traces.png "Traces")

Para el ejemplo demostrativo, vemos 2 trazas:
  - **Creación de imagen**: la traza nos informa del estado del agente respecto a la creacion de la imagen. 
  - **Creación de ficheros auxiliares**: la traza nos informa de la creación de los ficheros auxiliares asociados a la imagen.

## Repositorio

Dentro del repositorio de imágenes, podremos ver la imagen que hemos creado en `/opt/opengnsys/ogrepository/images
`

![Image repository](./images/image_repository.png "Image repository")

## Llamadas API a los distintos componentes


1. **ogAgent**: Esta es la llamada que ogCore realiza al ogAgent para que este cree la imagen. Nos devuelve como resultado un **job_id** que será el que nos muestre en la interfaz la traza relacionada con la creación esta imagen.

````
curl -X POST --data '{"dsk":"1", "par":"2", "cpt":"83", "idi":"01936caf-facb-72ad-9446-97e7dbf2b96a", "nci":"image-test", "ipr":"192.168.68.55", "nfn":"CrearImagen", "ids":"0"}' 
https://192.168.2.2:8000/CloningEngine/CrearImagen
{"job_id": "CrearImagen-93992a4b"}
````

2. **ogRepository**: Esta es la llamada que ogCore realiza al ogRepository para que este cree los ficheros auxiliares asociados a la imagen. Nos devuelve como resultado un **job_id** que será el que nos muestre en la interfaz la traza relacionada con la los mismos.

````
curl -X POST --data '{"image":"image-test.img"}' 
https://192.168.68.55:8006/ogrepository/v1/images/torrentsum
{"job_id": "CreateAuxiliarFiles_eba647d4"}
````

Estas llamadas comunican sus estados a ogCore mediante **webhooks**, y este se encarga de procesar la respuesta y cambiar el estado cuando sea necesario.
