vRA 8.1 – Subir archivos como parte de un request de vRA

Hace un par de semanas estuve trabajando con un cliente este caso de uso, y pensé que seria interesante mostrarlo aquí.

Básicamente la idea es cargar un archivo en una solicitud de catálogo y, a continuación, procesarlo en vRO.

¡¡Así que, empecemos!!

Diseño del servicio

La idea de este simple servicio es cargar un archivo como parte de una solicitud de un elemento del catálogo de vRA, en service broker, para luego procesarlo en un workflow de vRO.

En este ejemplo, el workflow no tiene ningún parámetro de entrada. El parámetro «file Upload» se agrega en vRA (Form designer) y recupera el valor vRO, al ejecutar el workflow.

Diseño del Formulario en vRA

Desde una perspectiva de elemento de catálogo, el blueprint, para este ejemplo, es un simple workflow de vRO presentado como un elemento de catalogo de XaaS.

Este workflow, en vRO, no tiene ningún parámetro de entrada. Los valores del fichero que se solicitara al usuario se recopilarán a través de llamadas API, dentro de la ejecucion de workflow.

He añadido en «Form desginer» un valor de entrada de tipo «File Upload», como podemos ver en la captura de pantalla.

Como podemos ver aquí, la variable de entrada que se va a utilizar es de tipo «File Upload» y no hay ninguna variable de entrada en el workflow de vRO asociada a ella.

Workflow de vRO

El workflow de vRO utilizado para este ejemplo puede ser dividido en dos partes principales

Obtener detalles de la solicitud realizada en vRA

  1. Obtener Token para luego ejecutar las operaciones de REST

A continuación se muestra un ejemplo de código para obtener un token basado en usuario y contraseña:

//Get Token

var url = "/csp/gateway/am/api/login?access_token";

var requestContent = '{ "username": "' + username + '", "password": "' + password + '"}';

var request = vRARestHost.createRequest("POST", url, requestContent);

request.setHeader("Content-Type", "application/json");

request.setHeader("Cache-Control", "no-cache");

var RestResponse = request.execute();

var token = JSON.parse(RestResponse.contentAsString).access_token;

  1. Obtener detalles del request, basado en la variable deploymentId

Usando el token que hemos obtenido anteriormente, utilizaremos las APIs de vRA para obtener los detalles del reques.

Los requisitos para ejecutar el código que veremos a continuación son:

  • La url base de la API para obtener los detalles del request es deployment/api/deployments/{deploymentId}
  • deploymentId puede obtenerse utilizando System.getContext().getParameter(«__metadata_deploymentId»)

Un ejemplo para obtener los detalles del request sería:

//Get Deployment based on deploymentId

var deploymentId = System.getContext().getParameter("__metadata_deploymentId")

var url = "deployment/api/deployments/"+deploymentId

var request = vRARestHost.createRequest("GET",url,"")

request.setHeader("Content-Type", "application/json");

request.setHeader("Cache-Control", "no-cache");

request.setHeader("Authorization","Bearer "+token);

var RestResponse = request.execute();

Procesamiento de variables de entrada

  1. Obtener variables de entrada

Basándonos en los detalles del request obtenidos anteriormente, podemos acceder al contenido de las variables de entrada utilizadas, las cuales incluyen el fichero que necesitamos procesar:

//Get Input Variables

var inputs = JSON.parse(RestResponse.contentAsString).inputs;

var ObjectKeys = Object.keys(inputs);

for(var i in ObjectKeys){

    if (ObjectKeys[i].indexOf("fileUpload")!=-1){

    var value = inputs[ObjectKeys[i]];

    var filelabel = value.label

    var filevalue = value.value.split(",")[1]

    System.log("filelabel: "+filelabel)

    System.log("filevalue: "+filevalue)

    var Base64fileData = filevalue

    };

};

  1. Transformar archivo Base64 en string

El fichero que necesitamos procesar en vRO está guardado, en el request de vRA, como un fichero Base64 por lo que deberemos convertirlo para poder interactuar con él:

Para esto he usado una acción desarrollada en Python, que ya tenia creada previamente para otro servicio. Podemos llamar a la acción de la siguiente manera:

var fileValues = System.getModule("xxxx.xxxx.xxx.xx").convertBase64(Base64fileData);

System.log(fileValues)

La acción que estoy usando quedaria de la siguiente manera:

import base64

import json

def handler(context, inputs):

    Base_file = inputs['Base64file']

    base_bytes = Base_file.encode('ascii')

    base_message = base64.b64decode(base_bytes)

    message = base_message.decode('ascii')

    return(message)

Cuando ejecuto esto desde Service Broker el formulario solicitará el archivo que se va a usar, el workflow de vRO obtendra el fichero utilizado en vRA y lo podra procesar sin problemas.

Suerte y cualquier comentario sera bienvenido!

Saludos y hasta la proxima!!!

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada.