{"id":116,"date":"2020-08-26T10:31:52","date_gmt":"2020-08-26T10:31:52","guid":{"rendered":"http:\/\/192.168.10.3:8585\/?p=116"},"modified":"2020-11-18T00:03:42","modified_gmt":"2020-11-17T23:03:42","slug":"vra-8-1-subir-archivos-como-parte-de-un-request-de-vra","status":"publish","type":"post","link":"https:\/\/thecloudarchitects.es\/?p=116","title":{"rendered":"vRA 8.1 \u2013 Subir archivos como parte de un request de vRA"},"content":{"rendered":"\n<p>Hace un par de semanas estuve trabajando con un cliente este caso de uso, y pens\u00e9 que seria interesante mostrarlo aqu\u00ed.<\/p>\n\n\n\n<p>B\u00e1sicamente la idea es cargar un archivo en una solicitud de cat\u00e1logo y, a continuaci\u00f3n, procesarlo en vRO.<\/p>\n\n\n\n<p>\u00a1\u00a1As\u00ed que, empecemos!!<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Dise\u00f1o del servicio<\/h1>\n\n\n\n<p>La idea de este simple servicio es cargar un archivo como parte de una solicitud de un elemento del cat\u00e1logo de vRA, en service broker, para luego procesarlo en un workflow de vRO. <\/p>\n\n\n\n<p>En este ejemplo, el workflow no tiene ning\u00fan par\u00e1metro de entrada. El par\u00e1metro \u00abfile Upload\u00bb se agrega en vRA (Form designer) y recupera el valor vRO, al ejecutar el workflow.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Dise\u00f1o del Formulario en vRA<\/h1>\n\n\n\n<p>Desde una perspectiva de elemento de cat\u00e1logo, el blueprint, para este ejemplo, es un simple workflow de vRO presentado como un elemento de catalogo de XaaS.<\/p>\n\n\n\n<p>Este workflow, en vRO, no tiene ning\u00fan par\u00e1metro de entrada. Los valores del fichero que se solicitara al usuario se recopilar\u00e1n a trav\u00e9s de llamadas API, dentro de la ejecucion de workflow.<\/p>\n\n\n\n<p>He a\u00f1adido en \u00abForm desginer\u00bb un valor de entrada de tipo \u00abFile Upload\u00bb, como podemos ver en la captura de pantalla.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"478\" src=\"http:\/\/192.168.10.3:8585\/wp-content\/uploads\/2020\/08\/Form-Designer-FileUpload-1024x478.png\" alt=\"\" class=\"wp-image-117\" srcset=\"https:\/\/thecloudarchitects.es\/wp-content\/uploads\/2020\/08\/Form-Designer-FileUpload-1024x478.png 1024w, https:\/\/thecloudarchitects.es\/wp-content\/uploads\/2020\/08\/Form-Designer-FileUpload-300x140.png 300w, https:\/\/thecloudarchitects.es\/wp-content\/uploads\/2020\/08\/Form-Designer-FileUpload-768x359.png 768w, https:\/\/thecloudarchitects.es\/wp-content\/uploads\/2020\/08\/Form-Designer-FileUpload.png 1424w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Como podemos ver aqu\u00ed, la variable de entrada que se va a utilizar es de tipo \u00abFile Upload\u00bb y no hay ninguna variable de entrada en el workflow de vRO asociada a ella.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Workflow de vRO<\/h1>\n\n\n\n<p>El workflow de vRO utilizado para este ejemplo puede ser dividido en dos partes principales<\/p>\n\n\n\n<p><strong>Obtener detalles de la solicitud realizada en vRA<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\" type=\"a\"><li>Obtener Token para luego ejecutar las operaciones de REST<\/li><\/ol>\n\n\n\n<p>A continuaci\u00f3n se muestra un ejemplo de c\u00f3digo para obtener un token basado en usuario y contrase\u00f1a:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><code>\/\/Get Token<\/code><\/p><p><code>var url = \"\/csp\/gateway\/am\/api\/login?access_token\";<\/code><\/p><p><code>var requestContent = '{ \"username\": \"' + username + '\", \"password\": \"' + password + '\"}';<\/code><\/p><p><code>var request = vRARestHost.createRequest(\"POST\", url, requestContent);<\/code><\/p><p><code>request.setHeader(\"Content-Type\", \"application\/json\");<\/code><\/p><p><code>request.setHeader(\"Cache-Control\", \"no-cache\");<\/code><\/p><p><code>var RestResponse = request.execute();<\/code><\/p><p><code>var token = JSON.parse(RestResponse.contentAsString).access_token;<\/code><\/p><\/blockquote>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\"><li>Obtener detalles del request, basado en la variable <em>deploymentId<\/em><\/li><\/ol>\n\n\n\n<p>Usando el token que hemos obtenido anteriormente, utilizaremos las APIs de vRA para obtener los detalles del reques.<\/p>\n\n\n\n<p>Los requisitos para ejecutar el c\u00f3digo que veremos a continuaci\u00f3n son:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>La url base de la API para obtener los detalles del request es <em>deployment\/api\/deployments\/{deploymentId}<\/em><\/li><li>deploymentId puede obtenerse utilizando <em>System.getContext().getParameter(\u00ab__metadata_deploymentId\u00bb)<\/em><\/li><\/ul>\n\n\n\n<p>Un ejemplo para obtener los detalles del request ser\u00eda:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><code>\/\/Get Deployment based on deploymentId<\/code><\/p><p><code>var deploymentId = System.getContext().getParameter(\"__metadata_deploymentId\")<\/code><\/p><p><code>var url = \"deployment\/api\/deployments\/\"+deploymentId<\/code><\/p><p><code>var request = vRARestHost.createRequest(\"GET\",url,\"\")<\/code><\/p><p><code>request.setHeader(\"Content-Type\", \"application\/json\");<\/code><\/p><p><code>request.setHeader(\"Cache-Control\", \"no-cache\");<\/code><\/p><p><code>request.setHeader(\"Authorization\",\"Bearer \"+token);<\/code><\/p><p><code>var RestResponse = request.execute();<\/code><\/p><\/blockquote>\n\n\n\n<p><strong>Procesamiento de variables de entrada<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\" type=\"a\"><li>Obtener variables de entrada<\/li><\/ol>\n\n\n\n<p>Bas\u00e1ndonos 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:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><code>\/\/Get Input Variables<\/code><\/p><p><code>var inputs = JSON.parse(RestResponse.contentAsString).inputs;<\/code><\/p><p><code>var ObjectKeys = Object.keys(inputs);<\/code><\/p><p><code>for(var i in ObjectKeys){<\/code><\/p><p><code>&nbsp;&nbsp;&nbsp; if (ObjectKeys[i].indexOf(\"fileUpload\")!=-1){<\/code><\/p><p><code>&nbsp;&nbsp;&nbsp; var value = inputs[ObjectKeys[i]];<\/code><\/p><p><code>&nbsp;&nbsp;&nbsp; var filelabel = value.label<\/code><\/p><p><code>&nbsp;&nbsp;&nbsp; var filevalue = value.value.split(\",\")[1]<\/code><\/p><p><code>&nbsp;&nbsp;&nbsp; System.log(\"filelabel: \"+filelabel)<\/code><\/p><p><code>&nbsp;&nbsp;&nbsp; System.log(\"filevalue: \"+filevalue)<\/code><\/p><p><code>&nbsp;&nbsp;&nbsp; var Base64fileData = filevalue<\/code><\/p><p><code>&nbsp;&nbsp;&nbsp; };<\/code><\/p><p><code>};<\/code><\/p><\/blockquote>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\"><li>Transformar archivo Base64 en string<\/li><\/ol>\n\n\n\n<p>El fichero que necesitamos procesar en vRO est\u00e1 guardado, en el request de vRA, como un fichero Base64 por lo que deberemos convertirlo para poder interactuar con \u00e9l:<\/p>\n\n\n\n<p>Para esto he usado una acci\u00f3n desarrollada en Python, que ya tenia creada previamente para otro servicio. Podemos llamar a la acci\u00f3n de la siguiente manera:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><code>var fileValues = System.getModule(\"xxxx.xxxx.xxx.xx\").convertBase64(Base64fileData);<\/code><\/p><p><code>System.log(fileValues)<\/code><\/p><\/blockquote>\n\n\n\n<p>La acci\u00f3n que estoy usando quedaria de la siguiente manera:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><code>import base64<\/code><\/p><p><code>import json<\/code><\/p><p><code>def handler(context, inputs):<\/code><\/p><p><code>&nbsp;&nbsp;&nbsp; Base_file = inputs['Base64file']<\/code><\/p><p><code>&nbsp;&nbsp;&nbsp; base_bytes = Base_file.encode('ascii')<\/code><\/p><p><code>&nbsp;&nbsp;&nbsp; base_message = base64.b64decode(base_bytes)<\/code><\/p><p><code>&nbsp;&nbsp;&nbsp; message = base_message.decode('ascii')<\/code><\/p><p><code>&nbsp;&nbsp;&nbsp; return(message)<\/code><\/p><\/blockquote>\n\n\n\n<p>Cuando ejecuto esto desde Service Broker el formulario solicitar\u00e1 el archivo que se va a usar, el workflow de vRO obtendra el fichero utilizado en vRA y lo podra procesar sin problemas.<\/p>\n\n\n\n<p>Suerte y cualquier comentario sera bienvenido!<\/p>\n\n\n\n<p>Saludos y hasta la proxima!!!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hace un par de semanas estuve trabajando con un cliente este caso de uso, y pens\u00e9 que seria interesante mostrarlo aqu\u00ed. B\u00e1sicamente la idea es cargar un archivo en una solicitud de cat\u00e1logo y, a continuaci\u00f3n, procesarlo en vRO. \u00a1\u00a1As\u00ed que, empecemos!! Dise\u00f1o del servicio La idea de este simple servicio es cargar un archivo &hellip;<br \/><a href=\"https:\/\/thecloudarchitects.es\/?p=116\" class=\"more-link pen_element_default pen_icon_none\">Seguir leyendo <span class=\"screen-reader-text\">vRA 8.1 \u2013 Subir archivos como parte de un request de vRA<\/span><\/a><\/p>\n","protected":false},"author":3,"featured_media":120,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[19],"tags":[20,22],"class_list":["post-116","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-vra","tag-vra","tag-vro"],"_links":{"self":[{"href":"https:\/\/thecloudarchitects.es\/index.php?rest_route=\/wp\/v2\/posts\/116"}],"collection":[{"href":"https:\/\/thecloudarchitects.es\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecloudarchitects.es\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecloudarchitects.es\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/thecloudarchitects.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=116"}],"version-history":[{"count":3,"href":"https:\/\/thecloudarchitects.es\/index.php?rest_route=\/wp\/v2\/posts\/116\/revisions"}],"predecessor-version":[{"id":131,"href":"https:\/\/thecloudarchitects.es\/index.php?rest_route=\/wp\/v2\/posts\/116\/revisions\/131"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecloudarchitects.es\/index.php?rest_route=\/wp\/v2\/media\/120"}],"wp:attachment":[{"href":"https:\/\/thecloudarchitects.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecloudarchitects.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecloudarchitects.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}