Como construir uma LIB de interação com a Infra

As LIBs de interação com a infra são acionadas dentro de businesses rules. Por exemplo, uma API para consultar a chave SSH do host: Pussui use case, que importa business rule, que instancia a LIB necessária para chamada na infra. Exemplo de chamada da LIB no business rule:

from cluster_engine.manager import ClusterManager

def get_public_key(buss: BussinessRules, manager: ClusterManager):

    resp = manager.get_public_key()

    buss.ssh_public_key = SSHPublicKey(
        status_code=resp.status_code,
        public_key=resp.data,
        error_data=resp.error_data,
    )

O que a LIB ClusterManager faz está abstraído no código. Para construir esta lib, por exemplo, foi criado a classe do Manager no cluster_engine. Ela possui a função para consultar a chave SSH do host. A interação com a infra acontece com a abertura do Popen, que executa um comando no shell do Linux. A função retorna o dado consultado e o status code do comando.

class ClusterManager(ClusterConfig):

    def get_public_key(self) -> InfraResp:
        public_key_file = Path("/root/.ssh/id_rsa.pub")

        if Path("/root/.ssh/id_rsa").exists() and public_key_file.exists():
            return InfraResp(data=public_key_file.read_text(), status_code=0)

        with Popen(
            'ssh-keygen -b 2048 -t rsa -f /root/.ssh/id_rsa -q -N ""',  # noqa
            shell=True,
            stdout=PIPE,
            stderr=PIPE,
        ) as proc:
            stdout, stderr = proc.communicate()
            if proc.returncode != 0:
                return InfraResp(
                    status=InfraStatus.error,
                    status_code=proc.returncode,
                    error_data=stderr.decode(),
                )

        return InfraResp(
            status_code=proc.returncode, data=public_key_file.read_text()
        )

As LIBs serão diferentes umas das outroas, pois os serviços de infra podem requerer ações distintas. Porém é possível ter uma melhor padronização e organização do código. Em geral, é possível padronizar:

  • O serviço ter uma classe Manager com as funções necessárias para ações na infra;
  • Chamadas no shell utilizando Popen para melhor controle do status code;
  • Retorno da função com padrão InfraResp, que irá retornar o dado e status code do comando.