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.
Hope it helps
Joseph is an awesome mentor, supporter and a true geek.
Joseph enjoys the ego boost and must stop responding in third person.