diff --git a/CHANGELOG.md b/CHANGELOG.md index 24b5bc7e1..8e9bae7b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Added +* Added `Update-RubrikNutanixCluster` as requested by Teixeirapa, also updated documentation in `Invoke-RubrikRestCall` to provide an example to do an empty post request. Resolves [Issue 669](https://github.com/rubrikinc/rubrik-sdk-for-powershell/issues/669) * Added 5.2 API calls for `Get-RubrikClusterStorage` as the endpoint to retrieve Average Daily Growth no longer exists in CDM 5.2. Resolves [Issue 664](https://github.com/rubrikinc/rubrik-sdk-for-powershell/issues/664) * Updated API stanza for 5.2 for the `Get-RubrikSyslogServer` cmdlet diff --git a/Rubrik/Private/Get-RubrikAPIData.ps1 b/Rubrik/Private/Get-RubrikAPIData.ps1 index 719c237ec..2d4fafd4f 100644 --- a/Rubrik/Private/Get-RubrikAPIData.ps1 +++ b/Rubrik/Private/Get-RubrikAPIData.ps1 @@ -3334,6 +3334,18 @@ function Get-RubrikAPIData { Success = '202' } } + 'Update-RubrikNutanixCluster' = @{ + '1.0' = @{ + Description = 'Refresh the metadata for the specified Nutanix Cluster' + URI = '/api/internal/nutanix/cluster/{id}/refresh' + Method = 'Post' + Body = '' + Query = '' + Result = '' + Filter = '' + Success = '202' + } + } 'Update-RubrikVCD' = @{ '1.0' = @{ Description = 'Refresh the metadata for the specified vCD Server' diff --git a/Rubrik/Public/Get-RubrikVM.ps1 b/Rubrik/Public/Get-RubrikVM.ps1 index 71d139a12..0405a0f36 100644 --- a/Rubrik/Public/Get-RubrikVM.ps1 +++ b/Rubrik/Public/Get-RubrikVM.ps1 @@ -28,6 +28,11 @@ function Get-RubrikVM Get-RubrikVM -Relic This will return all removed virtual machines that were formerly protected by Rubrik. + .EXAMPLE + Get-RubrikVM -SLAAssignment Unassigned + + Retrieves all VMware VMs that are currently not protected by any SLA + .EXAMPLE Get-RubrikVM -Name myserver01 -DetailedObject This will return the VM object with all properties, including additional details such as snapshots taken of the VM. Using this switch parameter negatively affects performance diff --git a/Rubrik/Public/Invoke-RubrikRESTCall.ps1 b/Rubrik/Public/Invoke-RubrikRESTCall.ps1 index 182d837a4..fb03556ea 100644 --- a/Rubrik/Public/Invoke-RubrikRESTCall.ps1 +++ b/Rubrik/Public/Invoke-RubrikRESTCall.ps1 @@ -39,6 +39,11 @@ function Invoke-RubrikRESTCall { Invoke-RubrikRESTCall -Endpoint 'fileset_template/bulk' -Method POST -Body $body -BodyAsArray Creates a new fileset from the given fileset template and the given host id supporting Direct Archive. Since fileset_template/bulk expects an array, we force the single item array with the BodyAsArray parameter. + + .EXAMPLE + Invoke-RubrikRESTCall -api internal -Endpoint nutanix/cluster/NutanixCluster:::d34d42c0-5468-4c37-a3cf-4376baf018e4/refresh -Method post + + Refreshes the information of the Nutanix cluster #> [cmdletbinding()] diff --git a/Rubrik/Public/Update-RubrikNutanixCluster.ps1 b/Rubrik/Public/Update-RubrikNutanixCluster.ps1 new file mode 100644 index 000000000..4a2a66e15 --- /dev/null +++ b/Rubrik/Public/Update-RubrikNutanixCluster.ps1 @@ -0,0 +1,75 @@ +#Requires -Version 3 +function Update-RubrikNutanixCluster +{ + <# + .SYNOPSIS + Connects to Rubrik to refresh the metadata for the specified Nutanix cluster + + .DESCRIPTION + The Update-RubrikNutanixCluster cmdlet will refresh all Nutanix metadata known to the connected Rubrik cluster. + + .NOTES + Written by Jaap Brasser for community usage + Twitter: @jaap_brasser + GitHub: jaapbrasser + + .LINK + https://rubrik.gitbook.io/rubrik-sdk-for-powershell/command-documentation/reference/update-rubriknutanixcluster + + .EXAMPLE + Get-RubrikNutanixCluster -Name 'nutanix.domain.local' | Update-RubrikNutanixCluster + This will refresh the Nutanix metadata on the currently connected Rubrik cluster + + .EXAMPLE + Get-RubrikNutanixCluster | Update-RubrikNutanixCluster + This will refresh the Nutanix metadata for all connected Nutanix instances on the currently connected Rubrik cluster + #> + + [CmdletBinding()] + Param( + # Nutanix Cluster id value from the Rubrik Cluster + [Parameter( + ValueFromPipelineByPropertyName = $true, + Mandatory = $true )] + [ValidateNotNullOrEmpty()] + [String]$id, + # Rubrik server IP or FQDN + [String]$Server = $global:RubrikConnection.server, + # API version + [ValidateNotNullorEmpty()] + [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 { + + $uri = New-URIString -server $Server -endpoint ($resources.URI) -id $id + $uri = Test-QueryParam -querykeys ($resources.Query.Keys) -parameters ((Get-Command $function).Parameters.Values) -uri $uri + $body = New-BodyString -bodykeys ($resources.Body.Keys) -parameters ((Get-Command $function).Parameters.Values) + $result = Submit-Request -uri $uri -header $Header -method $($resources.Method) -body $body + $result = Test-ReturnFormat -api $api -result $result -location $resources.Result + $result = Test-FilterObject -filter ($resources.Filter) -result $result + + return $result + + } # End of process +} # End of function \ No newline at end of file diff --git a/Rubrik/Rubrik.psd1 b/Rubrik/Rubrik.psd1 index 17992e720..26d0aafd8 100644 --- a/Rubrik/Rubrik.psd1 +++ b/Rubrik/Rubrik.psd1 @@ -297,6 +297,7 @@ 'Sync-RubrikAnnotation', 'Sync-RubrikTag', 'Update-RubrikHost', + 'Update-RubrikNutanixCluster', 'Update-RubrikVCD', 'Update-RubrikVCenter', 'Update-RubrikVMwareVM') diff --git a/Tests/Update-RubrikNutanixCluster.Tests.ps1 b/Tests/Update-RubrikNutanixCluster.Tests.ps1 new file mode 100644 index 000000000..e42240a12 --- /dev/null +++ b/Tests/Update-RubrikNutanixCluster.Tests.ps1 @@ -0,0 +1,49 @@ +Remove-Module -Name 'Rubrik' -ErrorAction 'SilentlyContinue' +Import-Module -Name './Rubrik/Rubrik.psd1' -Force + +foreach ( $privateFunctionFilePath in ( Get-ChildItem -Path './Rubrik/Private' | Where-Object extension -eq '.ps1').FullName ) { + . $privateFunctionFilePath +} + +Describe -Name 'Public/Update-RubrikNutanixCluster' -Tag 'Public', 'Update-RubrikNutanixCluster' -Fixture { + #region init + $global:rubrikConnection = @{ + id = 'test-id' + userId = 'test-userId' + token = 'test-token' + server = 'test-server' + header = @{ 'Authorization' = 'Bearer test-authorization' } + time = (Get-Date) + api = 'v1' + version = '4.0.5' + } + #endregion + + Context -Name 'Request Succeeds' { + Mock -CommandName Test-RubrikConnection -Verifiable -ModuleName 'Rubrik' -MockWith {} + Mock -CommandName Submit-Request -Verifiable -ModuleName 'Rubrik' -MockWith { + @{ + 'id' = 'REFRESH_METADATA_11111' + 'status' = 'QUEUED' + 'progress' = '0' + } + } + It -Name 'Should return QUEUED status' -Test { + ( Update-RubrikNutanixCluster -id '11111').status | + Should -BeExactly 'QUEUED' + } + Assert-VerifiableMock + Assert-MockCalled -CommandName Test-RubrikConnection -ModuleName 'Rubrik' -Times 1 + Assert-MockCalled -CommandName Submit-Request -ModuleName 'Rubrik' -Times 1 + } + Context -Name 'Parameter Validation' { + It -Name 'Parameter ID cannot be null' -Test { + { Update-RubrikNutanixCluster -id $null } | + Should -Throw "Cannot validate argument on parameter 'id'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again." + } + It -Name 'Parameter ID cannot be empty' -Test { + { Update-RubrikNutanixCluster -id '' } | + Should -Throw "Cannot validate argument on parameter 'id'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again." + } + } +} \ No newline at end of file diff --git a/azure-pipelines/scripts/Invoke-RunTests.ps1 b/azure-pipelines/scripts/Invoke-RunTests.ps1 index bd59d564c..1545ae1a6 100644 --- a/azure-pipelines/scripts/Invoke-RunTests.ps1 +++ b/azure-pipelines/scripts/Invoke-RunTests.ps1 @@ -1,4 +1,6 @@ -Install-Module -Name Pester -RequiredVersion 4.10.1 -Force +Install-Module -Name Pester -MaximumVersion 4.99.99 -Force +Remove-Module Pester -ErrorAction SilentlyContinue +Import-Module -Name Pester -MaximumVersion 4.99.99 $PesterSplat = @{ PassThru = $true