Exemplo de como utilizar chamadas REST API nas Actions do Orchestrator

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!

 

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *