Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add new Update-RubrikNutanixCluster cmdlet #674

Merged
merged 11 commits into from
Aug 12, 2020
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
12 changes: 12 additions & 0 deletions Rubrik/Private/Get-RubrikAPIData.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
5 changes: 5 additions & 0 deletions Rubrik/Public/Get-RubrikVM.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions Rubrik/Public/Invoke-RubrikRESTCall.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -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()]
Expand Down
75 changes: 75 additions & 0 deletions Rubrik/Public/Update-RubrikNutanixCluster.ps1
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions Rubrik/Rubrik.psd1
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,7 @@
'Sync-RubrikAnnotation',
'Sync-RubrikTag',
'Update-RubrikHost',
'Update-RubrikNutanixCluster',
'Update-RubrikVCD',
'Update-RubrikVCenter',
'Update-RubrikVMwareVM')
Expand Down
49 changes: 49 additions & 0 deletions Tests/Update-RubrikNutanixCluster.Tests.ps1
Original file line number Diff line number Diff line change
@@ -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."
}
}
}
4 changes: 3 additions & 1 deletion azure-pipelines/scripts/Invoke-RunTests.ps1
Original file line number Diff line number Diff line change
@@ -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
Expand Down