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!

