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!