Automated Installation of vRO Plugin using Python

If you are looking for a way to quickly install plugins in your vRealize Orchestrator (.dar or .vmoapp files), you can try this Python (.py) script which uses vRO ControlCenter API at its core. Prerequisites Script Link to gist: https://gist.github.com/imtrinity94/38ca08e7253e404a95386e56ff9be6fc Procedure For demo purpose, I will show the very few steps that you need to…

By

min read

Automated Installation of vRO Plugin using Python

If you are looking for a way to quickly install plugins in your vRealize Orchestrator (.dar or .vmoapp files), you can try this Python (.py) script which uses vRO ControlCenter API at its core.

Prerequisites

Script

# -*- coding: utf-8 -*-
"""
Automated Installation of vRO Plugin 1.0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

It is a python script to allow quick installation of plugins inside vRealize Orchestrator.
"""
__author__ = "Mayank Goyal, Harshit Kesharwani"

import base64
import csv
import email
import json
import os
import re
import smtplib
import time
import requests
import urllib3
from pathlib import Path
from string import Template
urllib3.disable_warnings()

def deployPlugin(vroUrl, username, password, filename):
    """Function to deploy plugin. Calls sub-functions like updateInstallPlugin() & finishInstallPlugin()."""
    url = (f"https://{vroUrl}/vco-controlcenter/api/plugins/installation")
    print(url)

    files = {'file': open(filename, 'rb')}
    headers = {'Accept': 'application/json'}
    response = requests.post(url, auth=(username, password), headers=headers, files=files, verify=False)

    statusCode = response.status_code
    if (statusCode == 201):
        responseData = response.json()
        payloadToUpdate = (responseData)
        pluginInstallationID = responseData['id']
        pluginName = payloadToUpdate.get("plugins")[0].get("name")
        print(f"pluginInstallationID : {pluginInstallationID}")
        
        time.sleep(2)
        updateStatus = updateInstallPlugin(vroUrl, username, password, pluginInstallationID, payloadToUpdate)
        if updateStatus:
            time.sleep(2)
            finishStatus = finishInstallPlugin(vroUrl, username, password, pluginInstallationID,pluginName)
            return finishStatus
        else:
            return False
    else:
        print(f"[ERROR]: Failed to execute Deploy request. Error code : {statusCode}")

    return False


def updateInstallPlugin(vroUrl, username, password, pluginInstallationID, payloadToUpdate):
    """Function to update plugin state."""
    url = (f"https://{vroUrl}/vco-controlcenter/api/plugins/installation/{pluginInstallationID}")
        
    t1 = payloadToUpdate.get("plugins")[0]
    t1.__setitem__("enabled", True)
    t1.__setitem__("logLevel", "DEFAULT")
    
    payloadToUpdate.__setitem__("plugins", [t1])
    
    t2 = {
      "name": str(payloadToUpdate.get("plugins")[0].get("name")),
      "newBuild": str(payloadToUpdate.get("plugins")[0].get("buildNumber")),
      "newVersion": str(payloadToUpdate.get("plugins")[0].get("version")),
      "state": "NEW_INSTALLED"
    }
    
    payloadToUpdate.__setitem__("installPluginStates", [t2])
    payloadToUpdate.__setitem__("eulaAccepted", True)
    payloadToUpdate.__setitem__("forceInstall", True)
    
    payload = json.dumps(payloadToUpdate)
    
    headers = {'Content-Type': 'application/json'}
    response = requests.request("POST", url, auth=(username, password), headers=headers, data=payload, verify=False)

    statusCode = response.status_code
    if (statusCode == 200):
        return True
    else:
        print(f"[ERROR]: Failed to execute Update request. Error code : {statusCode}")
        return False


def finishInstallPlugin(vroUrl, username, password, pluginInstallationID, pluginName):
    """Function to finalize the plugin installation."""
    url = (f"https://{vroUrl}/vco-controlcenter/api/plugins/installation/{pluginInstallationID}/finish")
    headers = {'Content-Type': 'application/json'}
    response = requests.request("POST", url, auth=(username, password), headers=headers, verify=False)
    statusCode = response.status_code
    if (statusCode == 200):
        responseData = response.json()
        print(f"Enable plugin name {pluginName}")
        time.sleep(2)
        changePluginState(vroUrl, username, password, pluginName)
        return True
    else:
        print(f"[ERROR]: Failed to execute Finish request. Error code : {statusCode}")
        return False


def changePluginState(vroUrl, username, password, pluginName):
    """Function to change set enabled=true which actually completes the installation process."""
    url = (f"https://{vroUrl}/vco-controlcenter/api/plugins/state")
    payload = json.dumps([{"enabled": True, "name": pluginName}])
    headers = {'Content-Type': 'application/json'}
    response = requests.request("POST", url, auth=(username, password), headers=headers, data=payload, verify=False)
    statusCode = response.status_code
    if (statusCode == 200):
        return True
    else:
        print(f"[ERROR]: Failed to execute changePluginState request. Error code : {statusCode}")
        return False


def checkPluginInstallation(vroUrl, username, password, pluginInstallationID):
    """Function to check if installation is completed or not."""
    url = (f"https://{vroUrl}/vco-controlcenter/api/plugins/installation/{pluginInstallationID}")
    headers = {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    }

    response = requests.request("GET", url, auth=(username, password), headers=headers, verify=False)
    statusCode = response.status_code
    print(f"statusCode : {statusCode}")
    if (statusCode == 200):
        return True
    else:
        print(f"[ERROR]: Failed to execute checkPluginInstallation request. Error code : {statusCode}")
        return False




if __name__ == '__main__':
    #User provided data
    vroUrl = input("Enter vRO FQDN: [Eg: fqdn.vro.local] ")
    username = input("Enter username: [Tip: try root] ")
    password = input("Enter password: [Tip: try root password] ")
    filename = input("Enter full path of plugin: [Eg: C:/Users/abcd/Downloads/plugin_file.vmoapp] ")
    deployPlugin(vroUrl, username, password, filename)
Python

Link to gist: https://gist.github.com/imtrinity94/38ca08e7253e404a95386e56ff9be6fc

Procedure

For demo purpose, I will show the very few steps that you need to install a vRO plugin named JsonPath in an automated fashion.

  • Copy the full path of downloaded plugin with filename itself.
    • C:\Users\mayank\Downloads\cloudblogger tutorial\o11nplugin-jsonpath-1.0.2.vmoapp
  • Run the script and provide values to required inputs
  • Reload vRO ControlCenter, the desired plugin will be already installed there.

Leave a Reply

Related Posts

2 responses to “Automated Installation of vRO Plugin using Python”

  1. Teknik Industri Avatar

    What are the key benefits of utilizing Python for automating the installation of vRO plugins?

    1. Mayank Goyal Avatar

      Well, the language could be any of your choice. However, the idea is to do the plugin installation in a automated fashion. This script not only is capable of doing that but also provides the steps to be followed if you choice any other language.

%d