Skip to content

Commit

Permalink
PowerCLI 12.4 vSphere APIs through PowerCLI demo script (#486)
Browse files Browse the repository at this point in the history
Signed-off-by: Dimitar Milov <dmilov@vmware.com>
  • Loading branch information
dmilov committed Sep 16, 2021
1 parent 5025ab9 commit a7cd4db
Showing 1 changed file with 262 additions and 0 deletions.
262 changes: 262 additions & 0 deletions Scripts/Demo/CallAPIsWithPowerCLI.ps1
@@ -0,0 +1,262 @@
<#
Copyright 2021 VMware, Inc.
SPDX-License-Identifier: BSD-2-Clause
#>

# This is a Demo Script for different ways to call different vSphere APIs with PowerCLI 12.4
# It is an interactive script that is supposed to be executed step by step in an Interactive PowerShell
# session with PowerCLI 12.4 installed

#region 1. Connect to a vCenter Server with PowerCLI
# Specify VC Server Here
$VCServerAddress = '10.186.100.116'


Connect-VIServer -Server $VCServerAddress
#endregion

#region 2. Open vSphere APIs web documentation pages
# The entry point to all APIs documentation
Start-Process https://developer.vmware.com

# Access SOAP API
Start-Process https://code.vmware.com/apis/968
#endregion

#region 3. vSphere SOAP APIs through PowerCLI

# Managed Objects - objects with operations
# DataObject - structures of data
# Get-View - retrieves Managed Object Instance

## Retrive Managed Object Instance by Managed Object Name with Get-View
Get-View ServiceInstance
Get-View AlarmManager

## Discover API Operations
$alarmManagerMO = Get-View AlarmManager
$alarmManagerMO | Get-Member -MemberType Method

# Get Data Object
## Get the VCenter SOAP API Service Instance
$serviceInstance = Get-View ServiceInstance

## Get vCenter Server About Info through the SOAP API
$serviceInstance.Content.About
#endregion

#region 4. vSphere Automation APIs (JSON RPC)
Start-Process https://developer.vmware.com/docs/vsphere-automation/latest/
# Access JRPC API
Start-Process https://code.vmware.com/docs/13551/vsphere-automation-java-api-reference-7-0u2

## JRPC vSphere Automation SDK is exposed through Get-CISService
## Needs a CIS Connection
Connect-CISServer -Server $VCServerAddress
# Exploer services and check the integrated help for reference-7-0u2
Get-CisService

# Find appliance health services
Get-CisService com.vmware.appliance.health*

# Get appliance health check settings services
$health_check_settings = Get-CisService com.vmware.appliance.health_check_settings

$health_check_settings | Get-Member -MemberType CodeMethod
$health_check_settings.get()

Disconnect-CisServer
#endregion

#region 5. vSphere Automation REST APIs through PowerCLI

# PowerCLI 12.4 Exposes vSphere Automation REST APIs
# Access REST API
Start-Process https://developer.vmware.com/docs/vsphere-automation/latest/
Invoke-GetHealthSettings

$HealthCheckSettingsUpdateSpec = Initialize-HealthCheckSettingsUpdateSpec -DbHealthCheckStateManualBackup $false -DbHealthCheckStateScheduledBackup $true
Invoke-UpdateHealthSettings -HealthCheckSettingsUpdateSpec $HealthCheckSettingsUpdateSpec

# Using pipeline of initialize and invoke
Initialize-HealthCheckSettingsUpdateSpec -DbHealthCheckStateManualBackup $true -DbHealthCheckStateScheduledBackup $true | Invoke-UpdateHealthSettings; Invoke-GetHealthSettings

# Initialize/Invoke concept

# Online Help
Get-Help Invoke-UpdateHealthSettings -Online

# vSphere SDK Modules
Get-Module VMware.Sdk.vSphere* -ListAvailable

# Explore Availalable modules for vSphere Automation SDK API
Get-Module VMware.Sdk.vSphere* -ListAvailable | Select Name

# Explore Invoke commands available for the Appliance APIs
Get-Command -Module VMware.Sdk.vSphere.Appliance -Name Invoke*

# Create Appliance Local Account

$LocalAccountsConfig = Initialize-LocalAccountsConfig -Password 'Tes$TPa$$w0Rd' -Roles 'superAdmin'
$LocalAccountsCreateRequestBody = Initialize-LocalAccountsCreateRequestBody -Username 'dmilov' -Config $LocalAccountsConfig
Invoke-CreateLocalAccounts -LocalAccountsCreateRequestBody $LocalAccountsCreateRequestBody

# Get Appliance Local Account
Invoke-GetUsernameLocalAccounts -UserName 'dmilov'

# Update Appliance Local Account
$LocalAccountsUpdateConfig = Initialize-LocalAccountsUpdateConfig -FullName "Dimitar Milov" -Email "dmilov@vmware.com"
Invoke-UpdateUsernameLocalAccounts -Username 'dmilov' -LocalAccountsUpdateConfig $LocalAccountsUpdateConfig

# Delete Appliance Local Account
Invoke-DeleteUsernameLocalAccounts -Username 'dmilov'
#endregion

#region 6. Bindings vs Invoke-RestMethod
## Create Session
$UserName = 'administrator@vsphere.local'
$Password = Read-Host "Passowrd:" -MaskInput
$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes("$($UserName):$($Password)"))
$sessionKey = Invoke-RestMethod `
-Method Post `
-Uri https://$VCServerAddress/api/session `
-Headers @{"Authorization"= "Basic $encodedCreds"} `
-ContentType 'application/json' `
-SkipCertificateCheck

## Prepare input for Local Account Creation

$requestBody = @{
"config"= @{
"password"= '$$$$TtRr0000NgGgg'
"roles"=@("admin")
}
"username"= "dimitar"
}

## Invoke POST api/appliance/local-accounts to Create a local account
Invoke-RestMethod `
-Method POST `
-Uri https://$VCServerAddress/api/appliance/local-accounts `
-Headers @{"vmware-api-session-id" = $sessionKey} `
-ContentType 'application/json' `
-SkipCertificateCheck `
-Body ($requestBody | ConvertTo-Json)

## Invoke GET api/appliance/local-accounts to Get the new local account
Invoke-RestMethod `
-Method GET `
-Uri "https://$VCServerAddress/api/appliance/local-accounts/dimitar" `
-Headers @{"vmware-api-session-id" = $sessionKey} `
-ContentType 'application/json' `
-SkipCertificateCheck

## Invoke Delete api/appliance/local-accounts to Delete the new local account
Invoke-RestMethod `
-Method DELETE `
-Uri "https://$VCServerAddress/api/appliance/local-accounts/dimitar" `
-Headers @{"vmware-api-session-id" = $sessionKey} `
-ContentType 'application/json' `
-SkipCertificateCheck
#endregion

#region 7. Create Advanced functions with PowerCLI 12.4 REST APIs bindings
function New-ApplianceUserAccount {
param(
[Parameter(Mandatory)]
[string]
$UserName,

[Parameter(Mandatory)]
[string]
$Password,

[Parameter(Mandatory)]
[ValidateSet('admin', 'superAdmin')]
[string]
$Roles
)

# Create
$LocalAccountsConfig = Initialize-LocalAccountsConfig -Password $Password -Roles $Roles
$LocalAccountsCreateRequestBody = Initialize-LocalAccountsCreateRequestBody -Username $UserName -Config $LocalAccountsConfig
Invoke-CreateLocalAccounts -LocalAccountsCreateRequestBody $LocalAccountsCreateRequestBody

# Get
Get-ApplianceUserAccount -UserName $UserName
}

function Get-ApplianceUserAccount {
param(
[Parameter(Mandatory)]
[string]
$UserName)

# Get
$accountApiResult = Invoke-GetUsernameLocalAccounts -UserName $UserName

# Output
[PSCustomObject]@{
'PSTypeName' = 'ApplianceUserAccount'
'UserName' = $UserName
'Roles' = $accountApiResult.roles
'FullName' = $accountApiResult.fullname
'Email' = $accountApiResult.email
'Enabled' = $accountApiResult.enabled
}
}

function Set-ApplianceUserAccount {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[ValidateNotNull()]
[PSCustomObject]
[PSTypeName('ApplianceUserAccount')]
$UserAccount,

[Parameter()]
[string]
$Email,

[Parameter()]
[string]
$FullName
)

# Update
$LocalAccountsUpdateConfig = Initialize-LocalAccountsUpdateConfig -FullName $FullName -Email $Email
Invoke-UpdateUsernameLocalAccounts -Username $UserAccount.UserName -LocalAccountsUpdateConfig $LocalAccountsUpdateConfig

# Get
Get-ApplianceUserAccount -UserName $UserAccount.UserName
}

function Remove-ApplianceUserAccount {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[ValidateNotNull()]
[PSCustomObject]
[PSTypeName('ApplianceUserAccount')]
$UserAccount
)

# Check account is available on the server
$accountOnTheServer = Get-ApplianceUserAccount -UserName $UserAccount.UserName

# Delete
if ($null -ne $accountOnTheServer) {
Invoke-DeleteUsernameLocalAccounts -Username $UserAccount.UserName
}
}


# User the new advanced functions
Get-Command *-ApplianceUserAccount

New-ApplianceUserAccount -UserName dmilov -Password 'Tes$TPa$$w0Rd' -Roles admin

Get-ApplianceUserAccount -UserName dmilov | Set-ApplianceUserAccount -Email dmilov@vmware.com -FullName 'Dimitar Milov'
Get-ApplianceUserAccount -UserName dmilov | Remove-ApplianceUserAccount
#endregion

0 comments on commit a7cd4db

Please sign in to comment.