Exemplo de como utilizar chamadas REST API nas Actions do Orchestrator
Diferentemente dos workflows, nas actions não temos tanta flexibilidade com relação a variáveis e por este motivo pode ser um pouco desafiador utilizar uma action para conectar em algum sistema externo via API e exibir informações em dropdown menus no item de catálogo.
Hoje vou te mostrar uma forma simples e interessante de fazer isso. Sem mais delongas, vamos ao que interessa. A ideia é obter as informações por meio de actions auxiliares. Vamos pensar juntos: para fazer uma chamada REST API para o vRA e obter todos os deployments precisariamos do token de autenticação, mas para obter este token é necessário um usuário e senha com acesso ao vRA. E claro, antes disso tudo é fundamental possuir o rest host. Então é exatamente isso que iremos construir agora.
O primeiro passo é criar um elemento de configuração adicionando as credenciais do vRA. Para isso navegue até o Orchestrator > Assets > Configurations.
Show. Agora vamos criar a nossa primeira action. Estas actions serão auxiliares, elas ajudarão a nossa action principal a obter as informações necessárias. O nome desta action será getRestHost e ela possui um input chamado RestHostName do tipo string e o return type é REST:RESTHost. Esta action vai basicamente pegar as informações do seu rest host. Sim, este rest host deve ser adicionado previamente e precisa estar aparecendo dentro do inventário (Orchestrator > Administrator > Inventory > HTTP REST).
var RestHost; var getHosts = RESTHostManager.getHosts(); for (var restHostId in getHosts) { var restHost = RESTHostManager.getHost(getHosts[restHostId]); if (restHost.name == RestHostName) { RestHost = restHost; } } return RestHost;
Agora vamos pra a segunda action auxiliar. O nome será getConfigurationElementByPath. Esta action possui dois inputs do tipo string: path e elementName. A função desta action é obter o caminho do configuration element.
var ConfigElement = Server.getConfigurationElementCategoryWithPath(path).configurationElements; //System.log(ConfigElement); for (var i =0 ; i< ConfigElement.length ; i++) { if (ConfigElement[i].name == elementName) { return ConfigElement[i]; } } return null;
Agora vamos para a terceira action auxiliar. Esta action se chamará getVraToken e será responsável por obter o token do vRA para podermos utiliza-lo na solicitação do REST API na próxima chamada. Esta action é um pouco mais complexa que a anterior. Aqui vamos utilizar a action que acabamos de criar para obter a informação do rest host do vRA e também o elemento de configuração que criamos anteriormente contendo as credenciais do vRA. ATENÇÃO: na primeira linha de código estou enviando a palavra vRA que é o nome do meu rest host e na segunda linha de código estou enviando PSO e vRA API que é a pasta onde o elemento de configuração está e o nome do elemento, respectivamente.
// get vRA rest host var RestHostvRA = System.getModule('conza.library').getRestHost('vRA'); // get configuration element var vraCred = System.getModule('conza.library').getConfigurationElementbyPath('PSO','vRA API'); // get values from configuration element var vraUser = (vraCred.getAttributeWithKey('vraUser')).value; var vraPass = (vraCred.getAttributeWithKey('vraPass')).value; // get access token var operation = "/csp/gateway/am/api/login?access_token"; var method = "POST"; var body = {username: vraUser, password: vraPass}; var request = RestHostvRA.createRequest(method, operation, JSON.stringify(body)); request.contentType = "application/json"; var response = request.execute(); var content = JSON.parse(response.contentAsString); var token = content.refresh_token; //System.log(response.statusCode); //log //System.log(token); //log // get bearer token var operation = "/iaas/api/login"; var method = "POST"; var body = {"refreshToken": token}; var request = RestHostvRA.createRequest(method, operation, JSON.stringify(body)); request.contentType = "application/json"; var response = request.execute(); var content = JSON.parse(response.contentAsString); var bearerToken = content.tokenType + " " + content.token; //System.log(response.statusCode); //log //System.log(bearerToken); //log return bearerToken;
Ufaaaaa, agora finalmente vamos para a action principal que irá exibir os deployments existentes no vRA e se chamará getVraDeployment. Aqui vamos utilizar as duas actions auxiliares, a primeira para obter o rest host e a segunda para pegar o token. Feito isso, basta realizar a chamada rest api normalmente. O return type desta action é string e como é esperado multiplos valores vamos marcar a opção array.
// get vRA Rest Host var RestHostvRA = System.getModule('conza.library').getRestHost('vRA') // get vRA token var token = System.getModule('conza.library').getVraToken(); var request = RestHostvRA.createRequest("GET","/deployment/api/deployments"); request.contentType = "application/json"; request.setHeader("Authorization", token); var response = request.execute(); //System.log("---> STATUS CODE: " + response.statusCode); //log var content = JSON.parse(response.contentAsString); //System.log(response.contentAsString); //log var result = []; for (var i = 0; i < content.content.length; i++) { //System.log(content.content[i].name); //log result.push(content.content[i].name); } return result;
E agora basta executar a action para testar se tudo está funcionando bem.
Voilà! Funcionou perfeitamente. Quero agradecer ao Jean Carvalho que sem querer foi a musa inspiradora deste artigo 🙂 Até a próxima!