Extensibility Proxy or vRO update: Now there is no need to create zip file of additional module for Polyglot languages .
Continue readingPython
VRA Cloud / On-Prem — How to Export managed machine using Python in CSV,HTML and Json
In this blog we will go through how we can utilise Python and export the managed machine for vSphere endpoint.
Continue readingVRA Cloud -Add the users in Projects and Change the owner of deployment dynamically using Python abx action
Recently i came across the used case , Where daily 100+ deployments are getting submitted via Service Account with CI/CD tool Jenkins or Code stream. Later VRA admin has to change the owner of the deployment to end user manually and To change the Owner of deployment currently VRA support only for those user who are explicitly part of project . VRA Admin first add the user in project and assign the permission then he does the change owner task.
Although it is 3-5 click Job but If we have to do for 100+ user , this can become very tedious task . To ease the Job I have created the Python ABX action and Yaml which will take the input who shall we be the owner of the deployment and Will add that user in Project and assign the ownership of deployment to specified user. Below shows the flow of operation.

As we see First we need Catalog Item which accepts the above items . For that below is the Yaml reference.
formatVersion: 1
inputs:
email:
type: string
title: Owner Email
pattern: "^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9]+.[a-zA-Z0-9]+$"
description: 'Enter valid email Address exam: support@vmwarecode.com'
role:
type: string
title: User Role
enum:
- administrator
- member
- viewer
type:
type: string
title: User Type
enum:
- user
resources:
Cloud_vSphere_Machine_1:
type: Cloud.vSphere.Machine
properties:
image: Linux
flavor: Small
constraints:
- tag: 'vCenter155:Cluster'
networks:
- network: '${resource.Cloud_vSphere_Network_1.id}'
Cloud_vSphere_Network_1:
type: Cloud.vSphere.Network
properties:
networkType: existing
constraints:
- tag: 'vCenter155:network'
Save the Blueprint and release it , Catalog Item will look like below.

Next step is create the Python ABX action, To do that we have some prerequisites
1. Save the VRA cloud api url in secrets by name VRAURL
2. Save CSP token with full role permission in secrets by name token.
Here is the screenshot for reference.

Once we have created above 2 secrets , we are good to go for creating Python ABX action.
Here is the code , Only thing I have hardcoded in Project ID in code in line number 11 . you may provide your project ID in code.
import requests
import json
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
def handler(context, inputs):
vraurl = context.getSecret(inputs['VRAURL'])
token = context.getSecret(inputs['token'])
deploymentid = inputs['deploymentId']
id = '4d0f75d5-8855-481b-a78d-2e5957fd8cc4'
email = inputs['requestInputs']['email']
role = inputs['requestInputs']['role']
type = inputs['requestInputs']['type']
api_version_url = f'{vraurl}/iaas/api/about'
headers = {
'accept': "application/json",
'content-type': "application/json"
}
output = requests.get(url=api_version_url, headers=headers, verify=False)
if output.status_code == 200:
latest_api_version = output.json()['latestApiVersion']
apiversion = latest_api_version
# Getting the Bearer token
# Getting the bearer token
iaasUrl = f"{vraurl}/iaas/api/login?apiVersion={apiversion}"
refreshtoken = token
iaasPayload = f'{{"refreshToken": "{refreshtoken}"}}'
iaasApiOutput = requests.post(iaasUrl, data=iaasPayload, headers=headers, verify=False)
if iaasApiOutput.status_code == 200:
print('Authentication completed with VRA Cloud')
jsondata = iaasApiOutput.json()['token']
bearerToken = "Bearer " + jsondata
bearertoken = bearerToken
headers = {
'accept': "application/json",
'content-type': "application/json",
'authorization': bearertoken
}
# adding the New User to Project
url = f'{vraurl}/project-service/api/projects/{id}/principals'
payload_schema = {
"modify": [
{
"email": "",
"type": "",
"role": ""
}
],
"remove": [
{
"email": "",
"type": ""
}
]
}
user_inputs = {
"email": email,
"type": type,
"role": role
}
payload_schema['modify'][0].update(user_inputs)
apioutput2 = requests.patch(url, headers=headers, data=json.dumps(payload_schema), verify=False)
if apioutput2.status_code == 200:
# Changing the owner
print(f'User {email} has been added to Project')
url2 = f'{vraurl}/deployment/api/deployments/{deploymentid}/requests'
data = {
"actionId": "Deployment.ChangeOwner",
"inputs": {
'New Owner': email
}
}
apioutput3 = requests.post(url2, headers=headers, data=json.dumps(data), verify=False)
print(apioutput3)
else:
print(apioutput2)
print(apioutput2.json())
else:
print(iaasApiOutput.status_code)
print(iaasApiOutput.json())
else:
print(output.status_code)
print(output.json())
Below is the Reference screenshot of Python ABX action.

Once we have created the Python Action , Last step is create the subscription.
We are using Deployment completed event here and Here is the screenshot.

All configuration is sorted , Now Once you submit the build via CI/CD or self Service , It will add the user in project with specified permission and change the deployment owner.
VRA Cloud -Python ABX action to send the VM provisioning status alerts to Slack & Microsoft teams
Recently I have written Blog for Automatic deletion and I have received multiple queries how can we notified before the deletion happens or what is the reason of failure. Previously i thought I will update failure reason in Python action.
Later I thought what if we get notification on common communicator like Slack, Teams, It would make job lot easier to keep track how many deployments were got failed or Success with Slack/Teams Notification, Also It would allow us to choose whether we want to send notification to Slack/ teams or not , If yes In which Channel we want to send the notification .
How to provide sequential VM names in VRA8/Cloud using Python vRO workflow
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
inputs:
leaseDate:
type: string
title: Lease Date
format: date-time
resources:
Cloud_Network_1:
type: Cloud.Network
properties:
constraints:
- tag: 'vsphere:network'
networkType: existing
Cloud_vSphere_Machine_1:
type: Cloud.vSphere.Machine
properties:
image: Images
abxaction: 'yes'
leaseDate: '${input.leaseDate}'
cpuCount: 1
totalMemoryMB: 1024
awaitIp: false
customizeGuestOs: false
storage:
constraints:
- tag: 'vsphere:ds'
constraints:
- tag: 'vsphere:cluster'
networks:
- network: '${resource.Cloud_Network_1.id}'
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
requests.packages.urllib3.disable_warnings(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 = requests.post(refreshtokenurl, data=payload, verify=False, headers=headers)
refreshtoken = apioutput.json()['refresh_token']
iaasPayload = f'{{"refreshToken": "{refreshtoken}"}}'
iaasApiOutput = requests.post(iaasUrl, data=iaasPayload, headers=headers, verify=False).json()['token']
bearerToken = "Bearer " + iaasApiOutput
print(bearerToken)
outputs = {}
outputs['vratoken'] = bearerToken
return outputs

import requests
import json
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
def handler(context, inputs):
token = inputs['vratoken']
vrafqdn = inputs['vrafqdn']
deploymentid = inputs['deploymentId']
print(token)
print(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 = requests.post(url, headers=headers,data=jdata, verify=False)
print(apioutput)
print(apioutput.json())

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.
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 .
- Please follow the detailed instruction Here python installation and required module before we use this module –Do not skip this step.
- 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 - I am using Python 3.9 for example ,It will be different as per your version.
- Once the step 1-3 is completed , all we need to do is run the below commands.
from VRA8 import vraClass
as1 =vraClass(vrafqdn="vra82.vmwarecode.com", username="administrator", password="VMware123!")
as1.getMachines()

Once we get the ID from above getmachines , we will run the deleteMachine to remove the stuck machine from VRA.
as1.deleteMachine(id='89af5f50-cb28-40ac-8734-d4dcc265fb8c')


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 manage vRealize Life Cycle Manager(VRLCM 8.2) using Python
Life cycle manager is awesome tool and their APIs are easy to use and understand .
I have tried almost 30+ api and I feel it is good and Handy way to check the details and perform basic operation using python and API