Public/Invoke-RubrikVgfUpgrade.ps1
#Requires -Version 3 function Invoke-RubrikVgfUpgrade { <# .SYNOPSIS Connects to Rubrik and sets the forceFull flag of any number of Volume Groups that needs upgrade .DESCRIPTION The Invoke-RubrikVgfUpgrade cmdlet will update the forceFull flag of a given list of Volume Groups. If these Volume Groups are using the SMB backup method, their forceFull flag will be set, and they will be upgraded to use the fast VHDX method in the next backup. .NOTES Written by Feng Lu for community usage github: fenglu42 .LINK https://rubrik.gitbook.io/rubrik-sdk-for-powershell/command-documentation/reference/invoke-rubrikvgfupgrade .EXAMPLE Invoke-RubrikVgfUpgrade -VGList VolumeGroup:::e0a04776-ab8e-45d4-8501-8da658221d74, VolumeGroup:::9136a7ef-4ad2-4bb9-bf28-961fb74d4322 This will set the forceFull flag of the given volume groups, if they need upgrade .EXAMPLE Get-RubrikVolumeGroup -hostname ad.flammi.home | Invoke-RubrikVgfUpgrade This will set the forceFull flag of the Volume Group belonging to the specified hostname, if it needs upgrade #> [CmdletBinding(SupportsShouldProcess = $true,ConfirmImpact = 'High',DefaultParameterSetName="None")] Param( # VolumeGroup ID [Parameter(Mandatory = $true,ValueFromPipelineByPropertyName = $true)] [ValidateNotNullOrEmpty()] [String[]]$VGList, # Print details during confirmation [switch]$notPrintingDetail, # Rubrik server IP or FQDN [String]$Server = $global:RubrikConnection.server, # API version [String]$api = $global:RubrikConnection.api ) Begin { # The Begin section is used to perform one-time loads of data necessary to carry out the function's purpose # If a command needs to be run with each iteration or pipeline input, place it in the Process section # Check to ensure that a session to the Rubrik cluster exists and load the needed header data for authentication Test-RubrikConnection # API data references the name of the function # For convenience, that name is saved here to $function $function = $MyInvocation.MyCommand.Name # Retrieve all of the URI, method, body, query, result, filter, and success details for the API endpoint Write-Verbose -Message "Gather API Data for $function" $resources = Get-RubrikAPIData -endpoint $function Write-Verbose -Message "Load API data for $($resources.Function)" Write-Verbose -Message "Description: $($resources.Description)" } Process { #get all volume groups format report $vgfReport = Get-RubrikVgfReport #filter Volume Groups by input and need for upgrade $vgIdsToUpgrade = @() $vgIdToNameMap = @{} foreach ($vgf in $vgfReport) { if ($VGList.Contains($vgf.ID)) { if($vgf.usedFastVhdx) { Write-Host "Skipping upgrade on $($vgf.ID) since its latest snapshot is already in the new fast VHDX format." } else { $vgIdsToUpgrade += $vgf.ID $vgIdToNameMap.Add($vgf.ID, $vgf.Name) } } } if ($vgIdsToUpgrade.count -eq 0) { Write-Host "No Volume Group to upgrade." return $null } #confirm action $promptString = "This command will set the following Volume Groups for format upgrade: $($vgIdToNameMap.Values -join "`r`n") " if ($notPrintingDetail) { $promptString = "" } $confirmation = Read-Host "$promptString Do you want to proceed? (y/N) " if ($confirmation -ne 'y') { return $null } #invoke upgrade by setting forceFull for each Volume Group foreach ($id in $vgIdsToUpgrade) { Write-Host "Setting $($vgIdToNameMap[$id]) for format upgrade on next backup..." $uri = New-URIString -server $Server -endpoint ($resources.URI) -id $id $uri = Test-QueryParam -querykeys ($resources.Query.Keys) -parameters @($id) -uri $uri #add forceFull to body $body = @{ $resources.Body.forceFull = $true } $body = ConvertTo-Json $body Write-Verbose "Body is $body" $result = Submit-Request -uri $uri -header $Header -method $($resources.Method) -body $body $result = Test-ReturnFormat -api $api -result $result -location $resources.Result $result = Set-ObjectTypeName -TypeName $resources.ObjectTName -result $result Write-Verbose "Done for $id with result $result" } Write-Host "" Write-Host "Successfully set the following Volume Groups for upgrade on the next backup:" Write-Host ($vgfReport | Where {$vgIdsToUpgrade.contains($_.ID)} | Select -ExpandProperty Name) } # End of process } # End of function |