How to perform automatic deletion of failed deployment in VRA 8 using Python ABX action

One of the most common scenario in VRA 8 is about testing and dealing with failed deployments. when we start provisioning the vms using VRA, there will be situation when we face multiple failures due to Configuration issues or Infra side issues .

In such scenario, Deleting the failed deployment one by one can become tedious task , here is the screenshot of similar situation .

Continue reading

How to provide VM lease date during the submission of VM build in VRA8 using ABX flow

Recently I was on working on scenario where we want to provide the lease date of VM at the time of submission. It is well known feature in 7.x which we get .

In VRA 8.x we can play with lease only with Day 2 actions.

With the help of extensibility you can provide the lease time during submission and use extensibility to trigger abx flow/ workflow as day 2.

The flow looks like below .

Here is my Yaml looks like.

formatVersion: 1
    type: string
    title: Lease Date
    format: date-time
    type: Cloud.Network
        - tag: 'vsphere:network'
      networkType: existing
    type: Cloud.vSphere.Machine
      image: Images
      abxaction: 'yes'
      leaseDate: '${input.leaseDate}'
      cpuCount: 1
      totalMemoryMB: 1024
      awaitIp: false
      customizeGuestOs: false
          - tag: 'vsphere:ds'
        - tag: 'vsphere:cluster'
        - network: '${}'

Here us my Catalog log request will look like.

It is simple blueprint and catalog request where I am using date-time as format in input and will be using for my ABX flow .

Here is the quick look of both abx action in flow
1. VRAtoken
2. Extend Lesse

import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning

def handler(context, inputs):
    vrafqdn = inputs['vrafqdn']
    username = inputs['username']
    password = inputs['password']
    refreshtokenurl = f"https://{vrafqdn}/csp/gateway/am/api/login?access_token"
    iaasUrl = f"https://{vrafqdn}/iaas/api/login"
    headers = {
        'accept': "application/json",
        'content-type': "application/json"
    payload = f'{{"username":"{username}","password":"{password}"}}'
    apioutput =, data=payload, verify=False, headers=headers)
    refreshtoken = apioutput.json()['refresh_token']
    iaasPayload = f'{{"refreshToken": "{refreshtoken}"}}'
    iaasApiOutput =, data=iaasPayload, headers=headers, verify=False).json()['token']
    bearerToken = "Bearer " + iaasApiOutput
    outputs = {}
    outputs['vratoken'] = bearerToken
    return outputs
Here is another action of setting the lease.
import requests
import json
from requests.packages.urllib3.exceptions import InsecureRequestWarning

def handler(context, inputs):
    token = inputs['vratoken']
    vrafqdn = inputs['vrafqdn']
    deploymentid = inputs['deploymentId']
    leasedate = inputs['requestInputs']['leaseDate']
    url = f'https://{vrafqdn}/deployment/api/deployments/{deploymentid}/requests'
    headers = {
        'accept': "application/json",
        'content-type': "application/json",
        'authorization': token
    data = {
        "actionId": "Deployment.ChangeLease",
        "inputs": {
            'Lease Expiration Date': leasedate
    jdata = json.dumps(data)
    apioutput =, headers=headers,data=jdata, verify=False)

Once we are done with creating the ABX action , we can create ABX Flow .

Here is the quick look for ABX flow

Once we are done with setting the flow , Last Part which is left is configuring the subscription.

Here is the quick look how my subscription looks like , we will be setting this on Deployment completed.

Disclaimer : My VRA lab has internet connectivity , so I can use any module online , you may need to make the action as module and zip it ,before you use as ABX action/flow . If you are using VRA Cloud then we can use as it is without any change.
Also This flow will trigger twice once ,One time failure is expected .

How to use Compute allocation & Network configure subscription to change the IP address and Rename of VM in VRA 8

As we talk about the automation in VM provisioning , One of the crucial step is to get the IP address from external source.

Recently I was working on used case where we want to provide the IP addresses at the time of submitting the provisioning.

There are multiple ways to do it in VRA and VRO . I am using VRA ABX Python action to achieve it.

Used Case: I want to submit more than one machine at time and provide the IP addresses at same time. For my example I am using 2 Machines here.

Subscription Used:

  • Compute Allocation
  • Network Configure

First Lets take a look at Blueprint’s Yaml where we define all custom properties.

formatVersion: 1
    type: string
    title: NewVMName1
    type: string
    title: NewVMName2
    type: string
    title: VM-1-IP
    title: VM-2-IP
    type: string
    type: Cloud.Machine
      firstVM: '${input.firstVM}'
      SecondVM: '${input.SecondVM}'
      VM1IP: '${input.VM1IP}'
      VM2IP: '${input.VM2IP}'
      abxaction: 'yes'
      count: 2
      image: VMwareCode-CentOS
      flavor: VMwareCode-small
        - network: '${}'
          assignment: static
    type: Cloud.vSphere.Network
      networkType: existing
        - tag: 'vsphere:network'

  • As we see above , I am using 4 Inputs as 2 VM names and 2 IP addresses in line 19-22
  • Line 23 we will use for condition in subscription
  • Also I am using static assignment in line 28-29
  • Line 35 is to Target the Network Profile where I have defined the Range

Once we are done with Blueprint, that is how it will look like when we click on Deploy

Since I am changing the name of VM and assigning the IP , I would need 2 ABX action
Below is the action is to change the VM Name as per Input

Below is the action Code in Python
def handler(context, inputs):
    firstVM = inputs['customProperties']['firstVM']
    secondVM = inputs['customProperties']['SecondVM']
    returnobj = inputs
    returnobj['resourceNames'][0] = firstVM
    returnobj['resourceNames'][1] = secondVM
    return returnobj

Here is the action for Assigning the IP addresses to correspond VMs.

Below is the python code for same
def handler(context, inputs):
    firstVMIP = inputs['customProperties']['VM1IP']
    SecondVMIP = inputs['customProperties']['VM2IP']
    outputs = {}
    addresses = [[]]
    outputs["addresses"] = addresses
    return outputs

If you have followed the article without missing any step, means you are done Python and Yaml code stuff.
Now all is left is Creation of the subscription If already not exist and Map to above created ABX python action.

To create the new Subscription follow below
Click on Cloud Assembly => Click Extensibility => Subscription = > Click New Subscription

Provide Name, enable Subscription and on Event Topic Choose Compute Allocation

If you noticed in YAML line number 23 I have specified the condition abxaction: yes

      abxaction: 'yes'

In subscription we are using that as condition to run and in action/workflow choose abx and above created action.

Click Save and we are done with Rename subscription.

Click New subscription once again and this time we will choose Network Configure subscription and network action , Rest all settings will be same.

so we have done all the coding and configuration , Now it is time to submit the VM provisioning request .

Once we submit this , You can check the outcome in action result or once vm allocation is done.

As we see the name as we submitted during provisioning, lets check the IP of each .

Both VMs got renamed and static IP which we entered has been applied to VMs.

Disclaimer: Indexing issue for multi Dimensional array has been fixed in 8.4.1, which was getting interchanged in 8.3 and 8.4

How to automate vm snapshot creation using csv and schedule automatic deletion of the snapshot using VRO 8

Snapshot is one of the great feature which we have in vSphere and which can be used like backup whenever we want to perform any change in Virtual Machine.

There are multiple ways to take the snapshot for VM using multiple products/Language.
We can use vSphere GUI or Rest APIs or pyvmomi or PowerCli .

Also as precaution when take snapshot , it is recommended to delete the snapshot after x amount of times unless we will end up in datastore full or High space utilization by vmdk .

And this is our topic of discussion of today where we automate the creation of snapshot and deletion using vro.
As we know PowerCli is great language to automate the stuff in vSphere and in VRO 8 it has been added as addtional language followed by Python.

I have used PowerCli for this workflow.

Also I have used Mime attachment as Input of CSV and Datagrid custom form element to display the existing snapshot in table.

Lets see the demo when we choose single VM from drop down

As we see once create snapshot is completed ,It will create schedule for deletion of the snapshot

For Single VM I am not checking for existing Snapshot , If you need you can take reference from multiple VM input where we are checking existing

Lets look into demo of Multiple VM’s snapshot ,where we are using CSV file as input , To process the CSV I am using Mime attachment

As you see in logs , If you specify the VM in CSV which is not in vCenter it will throw error in logs but It will not stop for other vms , If you need you can put stop on that also .

Here is the link for Package , which includes all actions and workflow related to this.

We can follow this Instruction to Import the Package

Once we are done with Import Package , Just changed the Variable value in VRO and enter your vCenter Name , UserID and Password

Here is my CSV file Sample, You do not need to have PowerState, Only thing is required is It should have name in heading

Disclaimer: We can not use this workflow as XAAS as Mime attachment is currently not supported in Service Broker for VRA8.4 .

How to utilize VRO PowerCli actions to make the VRA custom form dynamics for cluster, network and Folder in vRealize Automation 8

Recently I was working on used case where we need to make the custom form dynamics in VRA 8 . Dynamic custom forms ease the job because we do not need to hard code everything .

There are multiple ways to do this like you can use JavaScript which is being used in vro from long time


You can use Python and Utilize Rest API calls , Python support is added in VRA 8 design along with PowerCli.

I will be covering PowerCli language for the dynamic selection for Cluster, network and Folder

Now lets look at Yaml side configuration which is required

formatVersion: 1
    type: string
    title: NewVMName
    type: string
    title: Enter Cluster
    type: string
    title: NetworkPortGroup
    type: string
    title: Choose Application
    type: string
    title: Choose Sub-Application
    type: Cloud.vSphere.Machine
      newVMName: '${input.newVMName}'
      abxaction: 'yes'
      image: VMwareCode-CentOS
      flavor: VMwareCode-small
      folderName: '${"VRM/" + (input.Application) + "/"+ (input.Sub-Application)}'
        - tag: '${input.Cluster}'
        - network: '${}'
    type: Cloud.vSphere.Network
      networkType: existing
        - tag: '${input.Network}'

As we see in highlighted row , I am taking input of 4 inputs which we will be using in custom form and I am using tags to force those values

To make the tagging work ,I have assigned same tag name as object l

Before I jump to VRO side. lets take a look how my Custom form looks like.

As you see I am getting drop down list for Enter Cluster field , To make this field Dynamic I have created VRO action and mapped to custom form.

Lets have a look PowerCli vro Action first ,Later we will see the mapping in custom form.
function Handler($context, $inputs) {
  $connection=Connect-VIServer -Server -User administrator@vsphere.local -Password VMware123! -force
  $cluster=get-cluster|select name
  $clustername = $
  $as=disconnect-viserver -Server -confirm:$False
  return $clustername

Either you can use the admin account or Service Account which has admin rights

Once we create action lets jump to custom form and Map the above created action .

In Custom form i chose drop down for dynamic list for Enter cluster field

In default value section I have given one of the cluster name and Value source I have set as External Source.
Since we have chosen string of array in vro and drop down in custom form , when you search for action name you will see it will reflect there

Note: com.vmwarecode/ is my Package name where I have saved all my actions, It will be different for you.

Now next task is chosen the Network Port Group based on Cluster name.

Lets have a look how does network portgroup looks like in Custom form

As you see in above screenshot , for NetworkPortGroup field the drop down is coming and those values are based on Cluster which we chose in last above step.

Lets take a look at VRO action for this one.

function Handler($context, $inputs) {
    $connection=Connect-VIServer -Server -User administrator@vsphere.local -Password VMware123! -force
    $cluster= $inputs.clusterName
    $pg=Get-Cluster $cluster|get-vmhost|Get-VDSwitch|Get-VDPortgroup|select name 
    $as=disconnect-viserver -Server -confirm:$false
    return $

As we see we are taking input for the clusterName then getting the Portgroup mapped to ESXi host which are mapped to cluster.

Once vro action is configured ,Lets have a look at Custom form settings.

As we see we are using external value for this field also and mapping the VRO action nameed getVirtualPortGroup
Also we are using Canvas field and mapping with Enter cluster field from canvas.

Now next task is choose the Folder name dynamically where VM will be provisioned .

Before we start coding for Folder , lets review the current architecture of Folders in vCenter.

As we can see in above screenshot , we have Main Folder Called VRM. Under that I have 2 Sub Folder called Dev and Prod

Under Dev I have 2 more sub folders called App-dev and AppTest
Under Prod I have 2 more sub folders called App-Prod and App-Test.

If we noticed we have same sub-folder named called App-Test in Dev and Prod Folder

Now lets have a look at folders in Custom form.

Once we select for Choose Application field, we will see child folders for above selected.

Lets look at VRO actions for both fields one by one.

Lets look at choose application vro action which is named as getParentFolder

function Handler($context, $inputs) {
    $connection=Connect-VIServer -Server -User -Password VMware123! -force
    $foldername=Get-Folder|?{$_.Parent -match "VRM"}|select Name
    $connremoved=Disconnect-VIServer -Server *  -Confirm:$false
    return $

Lets look at Choose Sub Application VRO action.

function Handler($context, $inputs) {
   $connection=Connect-VIServer -Server vcsa.vmwarecode -User -Password VMware123! -force
   $folder=Get-Folder|?{$_.Parent -match $as}|select Name
   $connremove= Disconnect-viserver -server * -confirm:$False
   return $foldername

VRO actions are completed here , lets jump tp custom form for folder.

Here is the configuration for Sub-Application field.

Caution: As this is lab environment ,Here we are entering the Username and Password inside the action .
It may conflict with security concern of your organization if any

How to remove machine from VRA which are stuck in provisioning status in VRA 8

Past I have written article where I showed how to remove the deployment from VRA if those are stuck here .
Recently I have come across the situation where we do not have deployment but machines are stuck Under Machine TAB in VRA.

This is what we see below is expected

Here is the screenshot where you see stuck in provisioning

To remove those machines which are stuck ,We can utilize the api to force delete those machines.

Along with deleting the stuck machines you can use same module for multiple things like below and take reference .

  • How to login to VRA 8
  • How to list total deployment
  • How to delete the deployment
  • How to list the Blueprint
  • How to release the blueprint
  • How to list the machines in VRA
  • How to delete the machines

We are covering above How to delete the machine in this article , for rest of the steps are attached in my previous blog.

No need to worry about if you are not from python background or do not know code, Just follow the below instruction and we are good .

  1. Please follow the detailed instruction Here python installation and required module before we use this module –Do not skip this step.
  2. Download the file from Above and unzip and copy the file by name VRA8 and paste the file in directory where python is installed
    general path in windows is : C:\Users\Administrator\AppData\Local\Programs\Python\Python39
  3. I am using Python 3.9 for example ,It will be different as per your version.
  4. Once the step 1-3 is completed , all we need to do is run the below commands.

from VRA8 import vraClass
as1 =vraClass(vrafqdn="", username="administrator", password="VMware123!")

Once we get the ID from above getmachines , we will run the deleteMachine to remove the stuck machine from VRA.


Once we get the response 202 , Go to browser and refresh the browser you will see the VM is no longer in list ,Also we run the getMachines once again.

Happy Learning , Feel free to share your queries and feedback on this .

How to rename the VM during the Deployment in VRA/VRO7.6(vRealize Automation 7.x)

Often there are situations where we want to automate the name generation of the VMs and There are multiple ways to do that in VRA.

We can use Machine Prefix feature which is inbuilt in VRA . we can navigate to Portal by below
Infrastructure => Compute Resources => Machine Prefixes

Another way is to use the VRO , As we all know we can Integrate anything in VRO , all we need is plugin. Another used case we can do is to Integrate with naming server then pass the value to VRA for VM Name or if we want to specify on runtime.

Recently I was working on used case , where I want to provide the VM name at the time of submitting the request , that is what we are covering on this Post .

Here is my request/ Custom form look like.

Before start the VRO part lets complete the pre-requisite for VRA /VRO configuration .

  • Click on Blueprint and click on custom property tab and add the below properties as in the screenshot .
  • Extensibility.Lifecycle.Properties.VMPSMasterWorkflow32.Requested value must be * .
  • VMNewName value must be blank .
  • Down the package from above and unzip the package .
  • Open VRO legacy Client .

Once VRO client is open , Change the view to Design and Import Package.

Choose the File which we download from above step.

Click open and Import the package certificate .

Select All files while importing.

  • Click Import selected elements
  • Once done we should be able to see the VMwareCode folder and Rename VM workflow.
  • Click on Rename VM workflow and click on edit
  • Click on Not SET for Host which is highlighted and choose the IAAS host from VRA plugin.
  • Click Select and Save and close and continue anyway — This step is required to get the value of VM and update the value
  • VRO configuration is done , Now lets configure the subscription in VRA.
  • To Configure the subscription login to vra and click on Administrator => Events => Subscription.
  • Click on New Subscription and choose the Machine Provisioning.
  • Click Next and Choose based on condition.
  • Click Next and Choose the workflow which we created in above step.
  • Click Next and choose the option for priority and blocking , Blocking means If workflow fails it will stop there and build will mark as failed.
  • Now Last step is left to create/edit the custom form for blueprint .
  • Go to the blueprint and click on custom form .
  • We will see the NewVMName field under the vSphere Machine section.

Once Done we are good to Test with provisioning
Note: I have choose HOST option also in my form which may not be available for you as this require separate configuration.

Here is the result of test provisioning.

How to delete deployment in VRA 8 using Python(API)

Often there are situation where deployment will get stuck in progress or We lost control to manage the deployment using GUI. In those situation we can utilize the APIs and get the task done.

But for VRA8 taking the bearer token is bit tedious task as we need to obtain 2 different token then make it as bearer token. To make it easier I have created Python Module where you just need to provide the Admin credentials and perform the operation .

To start the Process we need to meet the pre-requisites which are explain in below steps.

No need to worry about if you are not from python background or do not know code, Just follow the below instruction and we are good .

  1. Please follow the detailed instruction Here python installation and required module before we use this module –Do not skip this step.
  2. Download the file from Above and unzip and copy the file by name VRA8 and paste the file in directory where python is installed
    general path in windows is : C:\Users\Administrator\AppData\Local\Programs\Python\Python39
  3. I am using Python 3.9 for example ,It will be different as per your version.
  4. Once the step 1-3 is completed , all we need to do is run the below commands.
from VRA8 import vraClass
as1 =vraClass(vrafqdn="", username="administrator", password="VMware123!")

as1.getDeployments() -By Default this will list the 10000 deployment , We need to get the deployment ID from the list.

As we see , I have total 22 deployment in my environment and Now I will trigger the delete deployment request for deployment name Test11 for that ID is -6130ead4-638f-4050-ae7d-9279ee51ffa8.


Here response 202 means API has been triggered to delete . Now if we do getDeployment() again we only see 21 entries.

There are some additional function also which are part of this python module
Like getBlueprint() & releaseBlueprint()

Here is the quick look of both of them

as1.releaseBlueprint(id="cf9641b4-0242-4555-abae-26d8b72f542d", version=11)

Happy Learning , Feel free to share your queries and feedback on this .