As part of the VMware open source program, we have to update this repository with the correct license and copyright information. We add the BSD-2 Clause License for this repository. We mark all source code provided by VMware with the Copyright notice under BSD-2 Clause license. * Update repository license to BSD 2-Clause License * Update Copyright
327 lines
13 KiB
PowerShell
327 lines
13 KiB
PowerShell
<#
|
|
Copyright 2021 VMware, Inc.
|
|
SPDX-License-Identifier: BSD-2-Clause
|
|
#>
|
|
function Get-VMCPSettings {
|
|
<#
|
|
.NOTES
|
|
===========================================================================
|
|
Created on: 10/27/2015 9:25 PM
|
|
Created by: Brian Graf
|
|
Twitter: @vBrianGraf
|
|
VMware Blog: blogs.vmware.com/powercli
|
|
Personal Blog: www.vtagion.com
|
|
|
|
Modified on: 10/11/2016
|
|
Modified by: Erwan Quélin
|
|
Twitter: @erwanquelin
|
|
Github: https://github.com/equelin
|
|
===========================================================================
|
|
.DESCRIPTION
|
|
This function will allow users to view the VMCP settings for their clusters
|
|
|
|
.PARAMETER Cluster
|
|
Cluster Name or Object
|
|
|
|
.PARAMETER Server
|
|
vCenter server object
|
|
|
|
.EXAMPLE
|
|
Get-VMCPSettings
|
|
|
|
This will show you the VMCP settings for all the clusters
|
|
|
|
.EXAMPLE
|
|
Get-VMCPSettings -cluster LAB-CL
|
|
|
|
This will show you the VMCP settings of your cluster
|
|
|
|
.EXAMPLE
|
|
Get-VMCPSettings -cluster (Get-Cluster Lab-CL)
|
|
|
|
This will show you the VMCP settings of your cluster
|
|
|
|
.EXAMPLE
|
|
Get-Cluster | Get-VMCPSettings
|
|
|
|
This will show you the VMCP settings for all the clusters
|
|
#>
|
|
[CmdletBinding()]
|
|
param
|
|
(
|
|
[Parameter(Mandatory=$False,
|
|
ValueFromPipeline=$True,
|
|
ValueFromPipelineByPropertyName=$True,
|
|
HelpMessage='What is the Cluster Name?')]
|
|
$cluster = (Get-Cluster -Server $Server),
|
|
|
|
[Parameter(Mandatory=$False)]
|
|
[VMware.VimAutomation.Types.VIServer[]]$Server = $global:DefaultVIServers
|
|
)
|
|
|
|
Process {
|
|
|
|
Foreach ($Clus in $Cluster) {
|
|
|
|
Write-Verbose "Processing Cluster $($Clus.Name)"
|
|
|
|
# Determine input and convert to ClusterImpl object
|
|
Switch ($Clus.GetType().Name)
|
|
{
|
|
"string" {$CL = Get-Cluster $Clus -Server $Server -ErrorAction SilentlyContinue}
|
|
"ClusterImpl" {$CL = $Clus}
|
|
}
|
|
|
|
If ($CL) {
|
|
# Work with the Cluster View
|
|
$ClusterMod = Get-View -Id "ClusterComputeResource-$($CL.ExtensionData.MoRef.Value)" -Server $Server
|
|
|
|
# Create Hashtable with desired properties to return
|
|
$properties = [ordered]@{
|
|
'Cluster' = $ClusterMod.Name;
|
|
'VMCP Status' = $clustermod.Configuration.DasConfig.VmComponentProtecting;
|
|
'Protection For APD' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.VmStorageProtectionForAPD;
|
|
'APD Timeout Enabled' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.EnableAPDTimeoutForHosts;
|
|
'APD Timeout (Seconds)' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.VmTerminateDelayForAPDSec;
|
|
'Reaction on APD Cleared' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.VmReactionOnAPDCleared;
|
|
'Protection For PDL' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.VmStorageProtectionForPDL
|
|
}
|
|
|
|
# Create PSObject with the Hashtable
|
|
$object = New-Object -TypeName PSObject -Prop $properties
|
|
|
|
# Show object
|
|
$object
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function Set-VMCPSettings {
|
|
<#
|
|
.NOTES
|
|
===========================================================================
|
|
Created on: 10/27/2015 9:25 PM
|
|
Created by: Brian Graf
|
|
Twitter: @vBrianGraf
|
|
VMware Blog: blogs.vmware.com/powercli
|
|
Personal Blog: www.vtagion.com
|
|
|
|
Modified on: 10/11/2016
|
|
Modified by: Erwan Quélin
|
|
Twitter: @erwanquelin
|
|
Github: https://github.com/equelin
|
|
===========================================================================
|
|
.DESCRIPTION
|
|
This function will allow users to enable/disable VMCP and also allow
|
|
them to configure the additional VMCP settings
|
|
For each parameter, users should use the 'Tab' button to auto-fill the
|
|
possible values.
|
|
|
|
.PARAMETER Cluster
|
|
Cluster Name or Object
|
|
|
|
.PARAMETER enableVMCP
|
|
Enable or disable VMCP
|
|
|
|
.PARAMETER VmStorageProtectionForPDL
|
|
VM Storage Protection for PDL settings. Might be:
|
|
- disabled
|
|
- warning
|
|
- restartAggressive
|
|
|
|
.PARAMETER VmStorageProtectionForAPD
|
|
VM Storage Protection for APD settings. Might be:
|
|
- disabled
|
|
- restartConservative
|
|
- restartAggressive
|
|
- warning
|
|
|
|
.PARAMETER VmTerminateDelayForAPDSec
|
|
VM Terminate Delay for APD (seconds).
|
|
|
|
.PARAMETER VmReactionOnAPDCleared
|
|
VM reaction on APD Cleared. Might be:
|
|
- reset
|
|
- none
|
|
|
|
.PARAMETER Server
|
|
vCenter server object
|
|
|
|
.EXAMPLE
|
|
Set-VMCPSettings -cluster LAB-CL -enableVMCP:$True -VmStorageProtectionForPDL `
|
|
restartAggressive -VmStorageProtectionForAPD restartAggressive `
|
|
-VmTerminateDelayForAPDSec 2000 -VmReactionOnAPDCleared reset
|
|
|
|
This will enable VMCP and configure the Settings on cluster LAB-CL
|
|
|
|
.EXAMPLE
|
|
Set-VMCPSettings -cluster LAB-CL -enableVMCP:$False -VmStorageProtectionForPDL `
|
|
disabled -VmStorageProtectionForAPD disabled `
|
|
-VmTerminateDelayForAPDSec 600 -VmReactionOnAPDCleared none
|
|
|
|
This will disable VMCP and configure the Settings on cluster LAB-CL
|
|
|
|
.EXAMPLE
|
|
Set-VMCPSettings -enableVMCP:$False -VmStorageProtectionForPDL `
|
|
disabled -VmStorageProtectionForAPD disabled `
|
|
-VmTerminateDelayForAPDSec 600 -VmReactionOnAPDCleared none
|
|
|
|
This will disable VMCP and configure the Settings on all clusters available
|
|
#>
|
|
[CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact="High")]
|
|
param
|
|
(
|
|
[Parameter(Mandatory=$true,
|
|
ValueFromPipeline=$True,
|
|
ValueFromPipelineByPropertyName=$True,
|
|
HelpMessage='What is the Cluster Name?')]
|
|
$cluster,
|
|
|
|
[Parameter(Mandatory=$False,
|
|
ValueFromPipeline=$False,
|
|
HelpMessage='$True=Enabled $False=Disabled')]
|
|
[bool]$enableVMCP,
|
|
|
|
[Parameter(Mandatory=$False,
|
|
ValueFromPipeline=$False,
|
|
HelpMessage='Actions that can be taken in response to a PDL event')]
|
|
[ValidateSet("disabled","warning","restartAggressive")]
|
|
[string]$VmStorageProtectionForPDL,
|
|
|
|
[Parameter(Mandatory=$False,
|
|
ValueFromPipeline=$False,
|
|
HelpMessage='Options available for an APD response')]
|
|
[ValidateSet("disabled","restartConservative","restartAggressive","warning")]
|
|
[string]$VmStorageProtectionForAPD,
|
|
|
|
[Parameter(Mandatory=$False,
|
|
ValueFromPipeline=$False,
|
|
HelpMessage='Value in seconds')]
|
|
[Int]$VmTerminateDelayForAPDSec,
|
|
|
|
[Parameter(Mandatory=$False,
|
|
ValueFromPipeline=$False,
|
|
HelpMessage='This setting will instruct vSphere HA to take a certain action if an APD event is cleared')]
|
|
[ValidateSet("reset","none")]
|
|
[string]$VmReactionOnAPDCleared,
|
|
|
|
[Parameter(Mandatory=$False)]
|
|
[VMware.VimAutomation.Types.VIServer[]]$Server = $global:DefaultVIServers
|
|
)
|
|
|
|
Process {
|
|
|
|
Foreach ($Clus in $Cluster) {
|
|
|
|
Write-Verbose "Processing Cluster $Clus"
|
|
|
|
# Determine input and convert to ClusterImpl object
|
|
Switch ($Clus.GetType().Name)
|
|
{
|
|
"string" {$CL = Get-Cluster $Clus -Server $Server -ErrorAction SilentlyContinue}
|
|
"ClusterImpl" {$CL = $Clus}
|
|
default {Throw 'Please provide a cluster name or object'}
|
|
}
|
|
|
|
If ($CL) {
|
|
|
|
# Get the actual configuration of the Cluster
|
|
$ActualSettings = Get-VMCPSettings -Cluster $CL -Server $Server
|
|
|
|
# Show actual settings in the verbose mode
|
|
Write-Verbose "[$($CL.Name)] Actual VMCP settings "
|
|
Write-Verbose $ActualSettings
|
|
|
|
# Create the object we will configure
|
|
$settings = New-Object VMware.Vim.ClusterConfigSpecEx
|
|
$settings.dasConfig = New-Object VMware.Vim.ClusterDasConfigInfo
|
|
|
|
# Based on $enableVMCP switch
|
|
if ($enableVMCP -eq $false) {
|
|
$settings.dasConfig.vmComponentProtecting = "disabled"
|
|
}
|
|
elseif ($enableVMCP -eq $true) {
|
|
$settings.dasConfig.vmComponentProtecting = "enabled"
|
|
}
|
|
|
|
#Create the VMCP object to work with
|
|
$settings.dasConfig.defaultVmSettings = New-Object VMware.Vim.ClusterDasVmSettings
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings = New-Object VMware.Vim.ClusterVmComponentProtectionSettings
|
|
|
|
#Storage Protection For PDL
|
|
If ($PSBoundParameters.ContainsKey('VmStorageProtectionForPDL')) {
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForPDL = $VmStorageProtectionForPDL
|
|
} else {
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForPDL = $ActualSettings.'Protection For PDL'
|
|
}
|
|
|
|
#Storage Protection for APD
|
|
If ($PSBoundParameters.ContainsKey('VmStorageProtectionForAPD')) {
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForAPD = $VmStorageProtectionForAPD
|
|
} else {
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForAPD = $ActualSettings.'Protection For APD'
|
|
}
|
|
|
|
#Storage Protection for APD
|
|
If ($PSBoundParameters.ContainsKey('VmStorageProtectionForAPD')) {
|
|
switch ($VmStorageProtectionForAPD) {
|
|
"disabled" {
|
|
# If Disabled, there is no need to set enable Timeout Value
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForAPD = 'disabled'
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.enableAPDTimeoutForHosts = $false
|
|
}
|
|
|
|
"restartConservative" {
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForAPD = 'restartConservative'
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.enableAPDTimeoutForHosts = $true
|
|
}
|
|
|
|
"restartAggressive" {
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForAPD = 'restartAggressive'
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.enableAPDTimeoutForHosts = $true
|
|
}
|
|
|
|
"warning" {
|
|
# If Warning, there is no need to enable the Timeout Value
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForAPD = 'warning'
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.enableAPDTimeoutForHosts = $false
|
|
}
|
|
}
|
|
} else {
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForAPD = $ActualSettings.'Protection For APD'
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.enableAPDTimeoutForHosts = $ActualSettings.'APD Timeout Enabled'
|
|
}
|
|
|
|
#APD Timeout Enabled
|
|
If ($PSBoundParameters.ContainsKey('VmTerminateDelayForAPDSec')) {
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmTerminateDelayForAPDSec = $VmTerminateDelayForAPDSec
|
|
} else {
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmTerminateDelayForAPDSec = $ActualSettings.'APD Timeout (Seconds)'
|
|
}
|
|
|
|
# Reaction On APD Cleared
|
|
If ($PSBoundParameters.ContainsKey('VmReactionOnAPDCleared')) {
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmReactionOnAPDCleared = "$VmReactionOnAPDCleared"
|
|
} else {
|
|
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmReactionOnAPDCleared = $ActualSettings.'Reaction on APD Cleared'
|
|
}
|
|
|
|
# Execute API Call
|
|
If ($pscmdlet.ShouldProcess($CL.Name,"Modify VMCP configuration")) {
|
|
$modify = $true
|
|
$ClusterMod = Get-View -Id "ClusterComputeResource-$($CL.ExtensionData.MoRef.Value)" -Server $Server
|
|
$Task = $ClusterMod.ReconfigureComputeResource_Task($settings, $modify)
|
|
}
|
|
|
|
# Wait for the reconfiguration task to finish to show the result
|
|
If ($Task) {
|
|
$TaskID = "Task-" + $($Task.Value)
|
|
Get-Task -Id $TaskID -Server $Server | Wait-Task | Out-Null
|
|
Get-VMCPSettings -Cluster $CL -Server $Server
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|