VMware Cloud Community
NateApex
Contributor
Contributor
Jump to solution

[VRA/VRO8.1] Upload File Input Issues

Hello!

I was hoping someone can help me out with a VRA/VRO service catalog input question.

I have a VRO workflow which takes in an uploaded .csv file which I configure as an input in the workflow and is automatically added to the inputs form field section of the workflow

I have a test csv with the following content:
heading1,heading2,heading3

"row1-val1","row1-val2","row1-val3"

"row2-val1","row2-val2","row2-val3"

My script in the workflow gets the content from the uploaded CSV and displays them

var uploadCSVdata = uploadCSV || new MimeAttachment ();

System.log(uploadCSVdata.name);

System.log(uploadCSVdata.mimeType);

System.log(uploadCSVdata.content);

My code works if I use the “DEBUG” feature in the VRO workflow to upload the CSV

Result (correct):

2020-05-28 10:25:14.000 -06:00info __item_stack:/item1

2020-05-28 10:25:14.000 -06:00info test.csv

2020-05-28 10:25:14.000 -06:00info application/octet-stream

2020-05-28 10:25:14.000 -06:00info heading1,heading2,heading3

"row1-val1","row1-val2","row1-val3"

"row2-val1","row2-val2","row2-val3"

But I am trying to run this from the Service Broker Catalog and the upload file field is missing

Even If I try to customize the form the upload file is not there.

If I add another simple input like a text field it appears in the Workflow inputs it appears in both the Service Catalog request as well as in the customizable form section.

How do I get my workflow upload input to appear in Service Catalog?

Thanks

Reply
0 Kudos
1 Solution

Accepted Solutions
NateApex
Contributor
Contributor
Jump to solution

I just created a decodBase64 action with the following and pass the base64 content from the file upload to it and it returns the CSV content

//BASE 64 function

var Base64 = {


// private property

_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",


// public method for encoding

encode : function (input) {

   var output = "";

   var chr1, chr2, chr3, enc1, enc2, enc3, enc4;

   var i = 0;


  input = Base64._utf8_encode(input);


   while (i < input.length) {


  chr1 = input.charCodeAt(i++);

  chr2 = input.charCodeAt(i++);

  chr3 = input.charCodeAt(i++);


  enc1 = chr1 >> 2;

  enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);

  enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);

  enc4 = chr3 & 63;


   if (isNaN(chr2)) {

  enc3 = enc4 = 64;

  } else if (isNaN(chr3)) {

  enc4 = 64;

  }


  output = output +

   this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +

   this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);


  }


   return output;

},


// public method for decoding

decode : function (input) {

   var output = "";

   var chr1, chr2, chr3;

   var enc1, enc2, enc3, enc4;

   var i = 0;


  input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");


   while (i < input.length) {


  enc1 = this._keyStr.indexOf(input.charAt(i++));

  enc2 = this._keyStr.indexOf(input.charAt(i++));

  enc3 = this._keyStr.indexOf(input.charAt(i++));

  enc4 = this._keyStr.indexOf(input.charAt(i++));


  chr1 = (enc1 << 2) | (enc2 >> 4);

  chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);

  chr3 = ((enc3 & 3) << 6) | enc4;


  output = output + String.fromCharCode(chr1);


   if (enc3 != 64) {

  output = output + String.fromCharCode(chr2);

  }

   if (enc4 != 64) {

  output = output + String.fromCharCode(chr3);

  }


  }


  output = Base64._utf8_decode(output);


   return output;


},


// private method for UTF-8 encoding

_utf8_encode : function (string) {

  string = string.replace(/\r\n/g,"\n");

   var utftext = "";


   for (var n = 0; n < string.length; n++) {


   var c = string.charCodeAt(n);


   if (c < 128) {

  utftext += String.fromCharCode(c);

  }

   else if((c > 127) && (c < 2048)) {

  utftext += String.fromCharCode((c >> 6) | 192);

  utftext += String.fromCharCode((c & 63) | 128);

  }

   else {

  utftext += String.fromCharCode((c >> 12) | 224);

  utftext += String.fromCharCode(((c >> 6) & 63) | 128);

  utftext += String.fromCharCode((c & 63) | 128);

  }


  }


   return utftext;

},


// private method for UTF-8 decoding

_utf8_decode : function (utftext) {

   var string = "";

   var i = 0;

   var c = c1 = c2 = 0;


   while ( i < utftext.length ) {


  c = utftext.charCodeAt(i);


   if (c < 128) {

  string += String.fromCharCode(c);

  i++;

  }

   else if((c > 191) && (c < 224)) {

  c2 = utftext.charCodeAt(i+1);

  string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));

  i += 2;

  }

   else {

  c2 = utftext.charCodeAt(i+1);

  c3 = utftext.charCodeAt(i+2);

  string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));

  i += 3;

  }

  }

   return string;

}

}


return Base64.decode(input);

View solution in original post

5 Replies
lnairn
VMware Employee
VMware Employee
Jump to solution

Hi NateApex,

I've been working with a customer with the same use case and finally we've used (in Service Broker), a file upload variable created in form designer, not matched to any vRO variable. Then, in the vRO workflow, using the deploymentId, we've obtained via API calls the variables the user selected, including the CSV file.

Will this work for your use case?

Regards,

Leandro.

Reply
0 Kudos
NateApex
Contributor
Contributor
Jump to solution

@inairn When I was playing with this, I was able to read the base64 code of the file uploaded contents, but I cannot seem to find me notes. Do you know how to decode the base64 text to a usable string?

Reply
0 Kudos
ctronco
Contributor
Contributor
Jump to solution

NateApex​  you might look at GitHub - vmware/o11n-plugin-crypto: vRealize Orchestrator Encryption Plugin or CryptoJS Hashers and Ciphers  as possible solutions. I am dealing with the a similar file upload issue but haven't had much of a chance to test pulling the data from the deployment info yet.

Reply
0 Kudos
NateApex
Contributor
Contributor
Jump to solution

I just created a decodBase64 action with the following and pass the base64 content from the file upload to it and it returns the CSV content

//BASE 64 function

var Base64 = {


// private property

_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",


// public method for encoding

encode : function (input) {

   var output = "";

   var chr1, chr2, chr3, enc1, enc2, enc3, enc4;

   var i = 0;


  input = Base64._utf8_encode(input);


   while (i < input.length) {


  chr1 = input.charCodeAt(i++);

  chr2 = input.charCodeAt(i++);

  chr3 = input.charCodeAt(i++);


  enc1 = chr1 >> 2;

  enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);

  enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);

  enc4 = chr3 & 63;


   if (isNaN(chr2)) {

  enc3 = enc4 = 64;

  } else if (isNaN(chr3)) {

  enc4 = 64;

  }


  output = output +

   this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +

   this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);


  }


   return output;

},


// public method for decoding

decode : function (input) {

   var output = "";

   var chr1, chr2, chr3;

   var enc1, enc2, enc3, enc4;

   var i = 0;


  input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");


   while (i < input.length) {


  enc1 = this._keyStr.indexOf(input.charAt(i++));

  enc2 = this._keyStr.indexOf(input.charAt(i++));

  enc3 = this._keyStr.indexOf(input.charAt(i++));

  enc4 = this._keyStr.indexOf(input.charAt(i++));


  chr1 = (enc1 << 2) | (enc2 >> 4);

  chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);

  chr3 = ((enc3 & 3) << 6) | enc4;


  output = output + String.fromCharCode(chr1);


   if (enc3 != 64) {

  output = output + String.fromCharCode(chr2);

  }

   if (enc4 != 64) {

  output = output + String.fromCharCode(chr3);

  }


  }


  output = Base64._utf8_decode(output);


   return output;


},


// private method for UTF-8 encoding

_utf8_encode : function (string) {

  string = string.replace(/\r\n/g,"\n");

   var utftext = "";


   for (var n = 0; n < string.length; n++) {


   var c = string.charCodeAt(n);


   if (c < 128) {

  utftext += String.fromCharCode(c);

  }

   else if((c > 127) && (c < 2048)) {

  utftext += String.fromCharCode((c >> 6) | 192);

  utftext += String.fromCharCode((c & 63) | 128);

  }

   else {

  utftext += String.fromCharCode((c >> 12) | 224);

  utftext += String.fromCharCode(((c >> 6) & 63) | 128);

  utftext += String.fromCharCode((c & 63) | 128);

  }


  }


   return utftext;

},


// private method for UTF-8 decoding

_utf8_decode : function (utftext) {

   var string = "";

   var i = 0;

   var c = c1 = c2 = 0;


   while ( i < utftext.length ) {


  c = utftext.charCodeAt(i);


   if (c < 128) {

  string += String.fromCharCode(c);

  i++;

  }

   else if((c > 191) && (c < 224)) {

  c2 = utftext.charCodeAt(i+1);

  string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));

  i += 2;

  }

   else {

  c2 = utftext.charCodeAt(i+1);

  c3 = utftext.charCodeAt(i+2);

  string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));

  i += 3;

  }

  }

   return string;

}

}


return Base64.decode(input);

lnairn
VMware Employee
VMware Employee
Jump to solution

Hi NateApex​, code I've used to decode Base64 was (In Python):

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)

Reply
0 Kudos