TAG: vCloudAutomationCenter

Dynamically Assigning Property Dictionary Values

What makes vCAC such a dynamic product is definitely the use of the Property Dictionary.
If you’re still not familiar with it, you can read about it here (or here)
When using the property dictionary, you can unleash the full potential of the product. When you are able to update the property dictionary values dynamically, the possibilities are endless.

One example of using this scenario of dynamically updated property dictionary is allowing the user to set which vSphere portgroup (or VLAN) the machine will have when created. When a new portgroup is created in vsphere, the vCAC machine request page will be updated automatically as well.

For this special (and really important) use case , I’ve written a powershell module for vCAC Property dictionary (currently is @ version v0.9) with the help of some REST/JSON Functions written by Tom O’rourke . You can download the powershell module at the bottom of the page as well. Now, with the help of powerCLI & and the vCACPSModule we can grab all of vSphere’s portgroups, and dynamically add them to a vCAC property. Lets see how!

First, we need to open a powershell console on our vCAC Module Manager web server , and type in the following commands:

– This will create a new Property Dictionary for us to use, we can do this through the UI as well.

Import-Module vCACPSModule
New-vCACProperty -server -PropertyName "VirtualMachine.Netowrk.Choice" -PropertyType DropdownList -IsRequired True

– Our second stage is to create and schedule a script with the following code, in order to get vsphere portgroups and dynamically insert them into the vCAC Property dictionary with the help of the vCAC Powershell Module (Adjust the logic for getting the networks you actually need by cluster / name etc / use different network choices for different blueprints etc)

# GrabvSphereNetworks.ps1
Import-Module vCACPSModule
Add-PSSnapIn vmware.vimautomation.core
connect-viserver $vCenter -username $user -password $Password
# Edit to retrieve portgroups according to any logic you want
$Networks = Get-virtualportgroup | where-object Name -match "dvp" | Select Name -unique
# Changes the network list to something in format of a comma delimited string: "net1,net2,net3"
$Networks = ($networks | select -expand name ) -join ","
# Updates the vCAC property with the new values
update-vcacpropertyattribute -server -PropertyName "VirtualMachine.Network.Choice" -AttributeName Networks -AttributeType ValueList -AttributeValue $Networks
disconnect-viserver -confirm:$false

– Third stage, is to add the “VirtualMachine.Network.Choice” property we’ve created to our blue print, and create a workflow for the machine to set “VirtualMahchine.Network0.Name” property, with the network we want it to have. Here, we’ll use the building machine stub workflow in order to do so.

Setting our blueprint with the relevant properties:

Adding the Blueprint with Custom Property we created

When requesting the machine we will be able to select a Network from our property:

Now lets create the workflow for actually setting the machine’s network property.

Open the vCAC Designer, and create a workflow for changing the VM network. First, load the “ExternalWFStubBuildingMachine” workflow, and edit it like so:


Don’t forget to create a Variable named “NetworkName” (or any other name) with a String Type.

Also, you need to set the red marked properties for each activity. On GetMachineProperty we’ll set

  • MachineID -> virtualmachineid
  • PropertyName – > “VirtualMachine.Network.Choice” (dont forget ” sign)
  • PropertyValue -> NetworkName (Our created string variable)

At the SetMachineProperty, we’ll just set

  • MachineID -> virtualmachineid
  • PropertyName -> “VirtualMachine.Network0.Name”
  • PropertyValue -> NetworkName (Our created string variable)

Now we’ll Load the workflow back to the database.

In order for this to work , technically the networks that are in the custom property should be checked at the vCAC reservation level. you can simply check all of the networks when you create the reservation, and re-select each newly added portgroup to the vSphere environment, while I figure out how to get this automatically done via the API’s as well :)

Also, you need to schedule the GrabvSphereNetwork.ps1 script , for it to update the dictionary property on a permanent basis.

But more importantly, this PS Module can be of use to plenty of other use cases, for example:

  • Building machines in specific vSphere Directories per property choice
  • Choosing Machine’s Service classification from CMDB (simply sync the dictionary properties with services existing in CMDB using powershell)

If you think of any other scenarios – Let me Know!!! Comment section is below :)

vCAC PS Module Download

You can see example usage of the module’s functions at the file’s bottom section! There are some really cool CSV capabilities!

Making the vCAC Description (and potentially any other) Field Mandatory

How many times have you provisioned a VM in your virtual enviroment, only to find out that you have no idea what its for a few weeks later?

One of the main difficulties in a self-serviced environment , is that this scenario is now a lot more common, as people can create their own VMs, giving them creative names like “MyVM1” for example.

Here’s a little customization tip for you to be able to enforce the description field on your happy vCAC Selfservice portal users.

Customization Steps:

1. Navigate to vCAC selfservice web files directory on your vCAC Server: %programfiles(x86)%VMwarevCACSelf-Service PortalViewsRequests

2. Back up (!!!) your original “NewRequest.cshtml” file and “AppService.cshtml” if your using vCloud vApps

3. Open the file, preferably with  notepad++ or something cshtml/tag aware

3.1 Search for the description label section looking like this:


Edit it in order to look like this (added red code):

<label><span class="required">*</span>@Labels.Description</label>

3.2 Edit the next line by adding required attribute, in order to look like this (add red code):

@Html.textareafor(m=>m.MachineRequest.Description, new{ cols=40, rows=4 , id= "descriptionText", TabIndex="1", @class = "k-input", required=""})

4. Do the same for AppService.cshtml , instead there span is a bit different:

<label><span class="required-mark">*</span>@Labels.Description</label>

adding required=”” is exactly the same.

Now, next time someone will try to submit a machine request without a description, he will get:

Enjoy :)

Note: Use this customization at your own risk! not I nor VMware inc. should be held responsible for any changes made in your environment / product

There are no more results.