Utilizando o Configuration Elements em Workflows e Actions do vRealize Orchestrator 8.x

Utilizando o Configuration Elements em Workflows e Actions do vRealize Orchestrator 8.x

Hoje vamos ver uma forma interessante de ter os formulários dinamicos durante a solicitação de itens de catálogo no Aria Automation, porém, sem sacrificar o desempenho. É importante lembrar que para ser perceptível algum tipo de lentidão durante a solicitação é preciso ter muitas chamadas rest api simultaneas e/ou o fato de estar obtendo e listando muitos resultados.

Vamos imaginar que possuimos um item de catálogo e temos a possibilidade de escolher a quantidade de memória RAM, CPU, disco e rede. Especificamente na parte da rede, o freguês gostaria que fossem listadas apenas opções que estão associadas ao projeto do usuário que está solicitando, ou seja, o dropdown da rede será dinamico e baseado no projeto. A forma mais comum de fazer isso seria utilizando uma chamada rest api dentro de uma action no Orchestrator, porém, digamos que existem váras outras chamadas rest api para outros menus e que além disso a quantidade de opções exibidas para cada projeto é relativamente alta. Neste caso, a alternativa seria fazermos a chamada rest api utilizando um workflow agendado no Orchestator, armazenar estes dados em um configuration element e por fim fazer com que a action do Orchestrator obtenha os dados do configuration element ao invés de fazer chamadas rest api diretamente. Neste cenário temos as informações dinamicas porque o workflow agendado executa algumas vezes ao dia garantindo que as informações estão atualizadas e temos um tempo de resposta baixo, visto que a consulta é estática. Entenderam, né?! Então vamos colocar isso em prática!

Então basicamente vamos precisar de um configuration element, um workflow e uma action. Primeiramente vamos criar um configuration element. Para isso, acesse o Orchestrator e em assets selecione configurations. Aqui vou criar um chamado de ConzaConfig com duas variáveis do tipo array chamadas de cliente e networkprofile.

Depois disso vamos criar um workflow que vou chamar de Get vRA Network Profile. Presta atenção na imagem abaixo, criei uma variável chamada ConzaConfig do tipo ConfigurationElement e associei aquele configuration que acabamos de criar. As outras variáveis são para obter o token do Aria Automation.

Então vamos relemebrar: neste workflow teremos duas etapas: 1) obter o token do Aria Automation para podermos fazer as chamadas rest api (não vou demonstrar aqui, escrevi bastante sobre isso) e 2) o código propriamente dito para efetuar as chamadas rest api e obter os dados que precisamos. A ideia aqui é obter o nome do network profile e o nome do cliente que está em uma tag chamada de cliente:nomecliente. O resultado final vai ser este: networkprofile: “meu network profile lindo” e cliente:conzasco. Reparem no $top=1000 😐

var operation = "/iaas/api/network-profiles?$top=1000";
var method = "GET";
var request = vraRestHost.createRequest(method, operation);
request.contentType = "application/json";
request.setHeader("Authorization", bearerToken);

var response = request.execute();
//System.log(response.statusCode); //log
var content = JSON.parse(response.contentAsString);
var networks = content.content;
var data1 = [];
var data2 = [];

for (var i = 0; i < networks.length; i++) {
    if (networks[i].tags != null) {
        clienteTag = networks[i].tags;
        for (var itags = 0; itags < clienteTag.length; itags++) {
            if (clienteTag[itags].key == "cliente") {
                System.log("---> NETWORK PROFILE: " + networks[i].name + " | CLIENTE: " + clienteTag[itags].value); // log
                data1.push(clienteTag[itags].value); 
                data2.push(networks[i].name);
            }
        }
    }
}

// envia o nome dos network profiles e clientes para o configuration element
var categoryPath = "PSO"; // folder
var elementName = "ConzaConfig";
var category = Server.getConfigurationElementCategoryWithPath(categoryPath);
var elements = category.configurationElements;
for (i = 0; i < elements.length; i++) {
    if (elements[i].name == elementName) {
        editableElement = elements[i];
        editableElement.setAttributeWithKey("cliente",data1);
        editableElement.setAttributeWithKey("networkprofile",data2);
    }
}

Se tudo estiver correto, será possível executar o workflow e ver os dados obtidos via rest api armazenados diretamente no configuration element. Agora você já pode agendar este workflow para executar automaticamente. O tempo exato entre cada execução vai depender da frequência que estas informações são atualizadas.

Só para garantir que estamos na mesma página, a imagem abaixo ilustra de onde estou obtendo os dados que foram armazenados. Observe que o network profile 03 possui dois clientes.

Agora vem a segunda parte. Criar a action para obter os dados do configuration element. Neste exemplo teremos um input chamado cliente e o return type será array.

Sem mais delongas, segue o código da action.

// obtem os valores do configuration element
var categoryPath = "PSO"; // folder
var configName = "ConzaConfig";
var category = Server.getConfigurationElementCategoryWithPath(categoryPath);
var elements = [];
for (i = 0; i < category.configurationElements.length; i++) {
    var jsonString = "";
    var configElementName = category.configurationElements[i].name;
    if (configElementName == configName) {
    for each (var attr in category.configurationElements[i].attributes) {
        jsonString += '"' + attr.name + '"' + ":" + '"' + attr.value + '",';
    }
    var finalString = '"' + configElementName + '": {' + jsonString + "}";
    elements.push(finalString);
    jsonOut = "{" + elements.join(",") + "}";
    //System.log(jsonOut);
    }
}
var parsed = JSON.parse(jsonOut);

// exibe os valores baseados no filtro (cliente)
var clientes = parsed[configName].cliente.split(',');
var networkprofile = parsed[configName].networkprofile.split(',');

var result = [];
for (i = 0; i < clientes.length; i++) {
  System.log("clientes: " + clientes[i] + " | network profile: " + networkprofile[i]);
  if (cliente == clientes[i]) {
    result.push(networkprofile[i]);
  }
}
return result;

Agora basta executar e ver o sucesso perante os seus olhos 🙂

Testando com outro cliente.

Agora basta associar com o seu blueprint ou diretamente no custom forms do item de catálogo e você terá um lindo dropdown menu dinâmico só que não. Abraço e 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 *