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.
