Tipos de servicios - UltraTesla/UTesla GitHub Wiki

Hay tipos de servicios que tienen finalidades y cualidades diferentes para propósitos diferentes.

Initializador

TODO: Falta agregar esta funcionalidad en el nucleo de UTesla

Administrativo

El servicio administrativo es el servicio encargado de determinar si un usuario cumple o no con algunos requisitos para poder seguir operando.

El servicio administrativo pre-fabricado que está ubicado en services/admin/admin.py, puede ser un perfecto ejemplo; éste determina si un usuario está o no usando un token, si es válido, si existe, si ha expirado y si lo está, lo elimina.

Este servicio además de ser una perfecta analogía con un panel de control también le ayuda al núcleo a usar un servicio que no se encuentra localmente, pero sí en otro nodo.

Un cliente no puede usar este servicio explícitamente, el núcleo lo impediría.

Para que pueda ser un servicio administrativo válido se deben usar dos métodos: access y remote.

El método access se encarga de válidar si un usuario cumple con algunos requisitos. Los requisitos pueden ser varios y dependiendo de la implementación de la infraestructura, pero como están por defecto en el servicio pre-fabricado es un buen ejemplo.

El método remote puede dar apoyo a UTesla cuando un servicio no existe localmente, pero puede que exista en algún nodo de la red.

El método access tiene que retornar True si el usuario cumple con los requisitos propuestos; False cuando no. El método remote no retorna nada.

El método access no es ejecutado cuando una acción de un servicio no requiere de un token de acceso.

Un ejemplo muy simplón de un servicio administrativo puede ser:

from modules.Infrastructure import errno

class Handler:
    def __init__(self):
        self.master_password = "123"

    def SET_CONTROLLER(self, controller, /):
        self.controller = controller

    async def access(self):
        if (self.master_password == self.controller.data):
            return True

        else:
            await self.controller.write_status(
                errno.EPERM, "La contraseña maestra no es válida"
                
            )

            return False

    async def remote(self):
        await self.controller.write_status(
            errno.ENOENT, "Servicio no encontrado"
            
        )

Este es un servicio administrativo muy simple. Para que un usuario pueda acceder exitosamente debe conocer la contraseña maestra (123), de lo contrario no se le permitirá operar.

Este pequeño servicio no tiene interacción con la red, por lo que si un servicio no existe se le mostraría al usuario que no se ha podido encontrar.

Lo negativo del servicio administrativo es que el núcleo no hace caso a los argumentos en el método __init__, por lo que si llega a colocar argumentos puede ocasionar una excepción.

El servicio administrativo puede ser especificado en la clave admin_service sobre el archivo de configuración config/UTesla.ini.

Índice

Un servicio índice no es más que un servicio, pero se puede acceder de dos formas: '/' o por su nombre.

Por ejemplo. Si tenemos un servicio llamado '/index' también puede ser accedido por /.

El servicio índice puede ser especificado en la clave index_name sobre el archivo de configuración config/UTesla.ini.

Servicio corriente

También conocido como simplemente servicio. Es un servicio típico que se ha mostrado alrededor de todos los tutoriales.