Random thoughts and technical bits

vRO Scriptable tasks

An old friend contacted me today with some vRO questions. He is struggling with learning vRO like so many administrators before him. It’s not easy to learn vRO it’s a very different type of programming. Once you learn the basics of the editor and especially JavaScript in scriptable tasks it becomes really powerful. So a few tips that I provided to my friend that may help you out when learning vRO:

JavaScript is case sensitive – this is hard for PowerShell or Windows users to remember

Variables are local to your scriptable task unless you make them an input or output (or both)

JavaScript variables don’t have defined types during creation (they are just pointers to memory locations)

Errors from JavaScript are not always very helpful (they point you to the incorrect or offending line)

You really should validate your input before taking an action

Case Sensitivity

I have rewritten a whole script to find out I missed a case for example a common one would be that is valid is:

System.log("Message");

While:

system.log("Message");

system.Log("Message");

Will all fail with a odd error. You have to watch case on reserved commands. This is true of API explorer objects VcVirtualMachine is VcVirtualMachine not VCvirtualmachine etc…

Types

Javascript has lots of different variable types including user defined objects. You can discover the object type using System.log. Assume that my object / variable is called new.

System.log(new);

Will output the type of object into the log window when run. This is very useful for discovering the object type. In the vCenter API you might have something like

vCenter.Cluster.Host.runtime.config.scsi[0]

If you want to understand your object type just use:

System.log(vCenter.Cluster.Host.runtime.config.scsi[0]);

And it will tell you the object. (this is a example and will not work)

Almost everything in vRO is a complex object which can be loosely defined as a combination of key value pairs in an array. A traditional array have multiple objects referenced like this:

array[0] = "magic"

array[1] = "cheese"

array[2] = "need"

This is a array of strings with a length of 3. If I called this:

System.log(array[0]);

The log would display “magic”

An object is an array with multiple key value pairs for each array element for example

array[0].firstname = Joseph

array[0].lastname = Griffiths

array[1].firstname = Tom

array[1].lastname = Bobo

array[2].firstname = Mac

array[2].lastname = Cheese

This allows me to store multiple elements that are connected and entries in the object don’t have to be the same type (e.g. firstname and lastname are both strings but I could add a age entry to hold a number). This provides a huge flexibility… those familiar with powercli this is the same as:

get-vm | fl

This will display all vm’s with a full list of the elements on the object of vm.

Error Handling

Errors will display the line number. Use that to determine the cause or source. I know almost every programmer needs to have the ability to test their assumptions around variables when writing programs use the System.log for this:

System.log("variable 1: " + var1 + " variable 2: " + var2);

System log is readable only by someone in vRO and not exposed to customers (unless they are running it from vRO)

Input validation

First check for null

if (variable1 == null)

{

//Null action

}

Then validate your object type using the System.log method above. There is a way for checking for complex system defined objects like this:

if (vm instanceof VcVirtualMachine)

{

//Do some action

}

This can be very useful when working with objects validate before you act.

About Author

Joseph Griffiths is a virtualization focused solutions architect who works with complex cloud based solutions. He currently holds many IT certifications including VMware VCDX-DCV and VCDX-CMA #143. This blog represents his random technical notes and thoughts. The thoughts expressed here do not reflect Joseph’s current employer in anyway. You can follow Joseph on Twitter @Gortees