Recently I needed to get a list of VMware vCO workflows from a remote server using PowerShell. A colleague of mine pointed me in the right direction by providing me with a URL to access the vCO Rest API on, as well as letting me know what I needed to send in order to authenticate.
To connect and retrieve content back in the PowerShell example below, we’ll need to:
- Access the Rest API URL for Orchestrator using a web client object
- Send basic authentication in the header of our request
Notes:
One thing I did notice is that when you use your web browser to test the URL, the result is returned to you as XML, however when I used a web client object in PowerShell, I got a result returned to me in JSON. The PowerShell script below is therefore tailored to interpret the result as JSON. This being so, you’ll need to make sure you are using PowerShell 3.0 or above, as the ConvertFrom-Json cmdlet is only available using PowerShell 3.0 and above.
When sending your authentication details with the web client object request, make sure your username/password combo are used in this format:
Authorization: Basic username:password
This means that your header you add to your web client option, should be added with the string as per the above, but with the username:password part encoded using base64. The script below takes this all into account, and all you need to do is provide your username and password for vCenter Orchestrator to the PowerShell function, it will handle the base64 encoding and passing of the values to the web client itself.
Anyway, enough of that, let us get onto the actual script itself. This is presented as a PowerShell function. Load it into your session (copy-paste) or add it to your PS profile for future use. Apologies for the formatting – Syntax Highlighter really messes with the formatting and nice clean indentation I normally have in my scripts!
Here is a direct download of the PowerShell script if the script paste below doesn’t work for you:
[wpdm_file id=31]
Function Get-VcoWorkflow() { <# .SYNOPSIS Fetches vCO Workflow information and details from a vCenter Orchestrator server .DESCRIPTION Fetches vCO Workflow information and details from a vCenter Orchestrator server .PARAMETER Username Username for the vCO server .PARAMETER Password Password for the vCO server .PARAMETER Server The vCO server hostname or IP address .PARAMETER PortNumber The port to connect on .EXAMPLE PS F:\> Get-VcoWorkflow -Username Sean -Password mypassword -Server 192.168.60.172 -PortNumber 8281 .LINK http://www.shogan.co.uk .NOTES Created by: Sean Duffy Date: 30/03/2014 #> [CmdletBinding()] param( [Parameter(Position=0,Mandatory=$true,HelpMessage="Specify your vCO username.", ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)] [String] $Username, [Parameter(Position=1,Mandatory=$true,HelpMessage="Specify your vCO password.", ValueFromPipeline=$false,ValueFromPipelineByPropertyName=$true)] [String] $Password, [Parameter(Position=2,Mandatory=$true,HelpMessage="Specify your vCO Server or hostname.", ValueFromPipeline=$false,ValueFromPipelineByPropertyName=$true)] [String] $Server, [Parameter(Position=2,Mandatory=$true,HelpMessage="Specify your vCO Port.", ValueFromPipeline=$false,ValueFromPipelineByPropertyName=$true)] [ValidateRange(0,65535)] [Int] $PortNumber ) process { $Report = @() | Out-Null # Craft our URL and encoded details note we escape the colons with a backtick. $vCoURL = "https`://$Server`:$PortNumber/vco/api/workflows" $UserPassCombined = "$Username`:$Password" $EncodedUsernamePassword = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($UserPassCombined)) $Header = "Authorization: Basic $EncodedUsernamePassword" # Ignore SSL warning [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} # Create our web client object, and add header for basic authentication with our encoded details $wc = New-Object System.Net.WebClient; $wc.Headers.Add($Header) # Download the JSON response from the Restful API, and convert it to an object from JSON. $jsonResult = $wc.downloadString($vCoURL) $jsonObject = $jsonResult | ConvertFrom-Json # Create a blank Report object array $Report = @() # Iterate over the results and transform the key/value pair like formatting to a proper table. # Note I use a hashtable to populate a new PSObject with properties, using values found in the original JSON result foreach ($link in $jsonObject.link) { $kvps = $link.attributes $HashTable = @{} $kvps | foreach { $HashTable[$_.name] = $_.value } # foreach item in the link object, populate the hashtable $NewPSObject = New-Object PSObject -Property $HashTable # Create a new PSObject and populate the properties/values using our hashtable # Add our populated object to our Report array $Report += $NewPSObject } return $Report } }
I hope that this script comes in handy, and gives you an idea as to how you can retrieve and convert data from vCO and its RESTful API for use in PowerShell 🙂
Results example after running the Function:
I’ll have to take a look what methods are available, on first glance it does look like there is a “getallworkflows” method that returns an array of workflow objects, so its entirely possible!
Nice script. But doesnt invoke-restmethod could do the trick more easily?
Thanks!