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

Oracle Database support in Rubrik SDK for PowerShell #266

Merged
merged 16 commits into from
Jun 26, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/).

## [Unreleased]

## 2019-06-26

### Modified [New-RubrikSnapshot cmdlet]
* Added support for Oracle to New-RubrikSnapshot
* Added tests for New-RubrikSnapshot

## 2019-06-25

### Added [New New-RubrikAPIToken cmdlet]
Expand All @@ -26,6 +32,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/).

* Added Remove-RubrikAPIToken cmdlet to address [316](https://github.com/rubrikinc/rubrik-sdk-for-powershell/issues/316) and associated unit test.

## 2019-06-24

### Added [New Get-RubrikOracleDB cmdlet]

* Added Get-RubrikOracleDB cmdlet to address [255](https://github.com/rubrikinc/rubrik-sdk-for-powershell/issues/255) and associated unit test

## 2019-06-20

### Added [New Remove-RubrikVMSnapshot cmdlet]
Expand Down
26 changes: 25 additions & 1 deletion Rubrik/Private/Get-RubrikAPIData.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,28 @@ function Get-RubrikAPIData($endpoint) {
Success = '200'
}
}
'Get-RubrikOracleDB' = @{
'1.0' = @{
Description = 'Get summary of all the Oracle DBs'
URI = '/api/internal/oracle/db'
Method = 'Get'
Body = ''
Query = @{
is_relic = 'is_relic'
is_live_mount = 'is_live_mount'
name = 'name'
effective_sla_domain_id = 'effective_sla_domain_id'
sla_assignment = 'sla_assignment'
primary_cluster_id = 'primary_cluster_id'
}
Result = 'data'
Filter = @{
'Name' = 'name'
'SLA' = 'effectiveSlaDomainName'
}
Success = '200'
}
}
'Get-RubrikOrganization' = @{
'1.0' = @{
Description = 'Get summary of all Rubrik organizations'
Expand All @@ -411,7 +433,7 @@ function Get-RubrikAPIData($endpoint) {
Body = ''
Query = @{
is_global = 'is_global'
name = 'name'
name = 'name'
}
Result = 'data'
Filter = @{
Expand Down Expand Up @@ -557,6 +579,7 @@ function Get-RubrikAPIData($endpoint) {
ManagedVolume = '/api/internal/managed_volume/{id}/snapshot'
Nutanix = '/api/internal/nutanix/vm/{id}/snapshot'
VolumeGroup = '/api/internal/volume_group/{id}/snapshot'
Oracle = '/api/internal/oracle/{id}/snapshot'
}
Method = 'Get'
Body = ''
Expand Down Expand Up @@ -1072,6 +1095,7 @@ function Get-RubrikAPIData($endpoint) {
MSSQL = '/api/v1/mssql/db/{id}/snapshot'
VMware = '/api/v1/vmware/vm/{id}/snapshot'
VolumeGroup = '/api/internal/volume_group/{id}/snapshot'
Oracle = '/api/internal/oracle/db/{id}/snapshot'
}
Method = 'Post'
Body = @{
Expand Down
5 changes: 5 additions & 0 deletions Rubrik/Private/Test-QueryParam.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@
Write-Verbose -Message 'Loading VolumeGroup API data'
$uri = ('https://'+$Server+$resources.URI.VolumeGroup) -replace '{id}', $id
}
'OracleDatabase:::*'
{
Write-Verbose -Message 'Loading OracleDatabase API data'
$uri = ('https://'+$Server+$resources.URI.Oracle) -replace '{id}', $id
}
default
{
throw 'The supplied id value has no matching endpoint'
Expand Down
116 changes: 116 additions & 0 deletions Rubrik/Public/Get-RubrikOracleDB.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
#requires -Version 3
function Get-RubrikOracleDB
{
<#
.SYNOPSIS
Retrieves details on one or more Oracle DBs known to a Rubrik cluster

.DESCRIPTION
The Get-RubrikOracleDB cmdlet is used to pull a detailed data set from a Rubrik cluster on any number of Oracle DBs

.NOTES
Written by Jaap Brasser for community usage
Twitter: @jaap_brasser
GitHub: jaapbrasser

.LINK
http://rubrikinc.github.io/rubrik-sdk-for-powershell/reference/Get-RubrikOracleDB.html

.EXAMPLE
Get-RubrikOracleDB -Name 'OracleDB1'
This will return details on all Oracle DBs named "OracleDB1".

.EXAMPLE
Get-RubrikOracleDB -Name 'OracleDB1' -SLA Gold
This will return details on all Oracle DBs named "OracleDB1" that are protected by the Gold SLA Domain.

.EXAMPLE
Get-RubrikOracleDB -Relic
This will return all removed Oracle DBs that were formerly protected by Rubrik.

.EXAMPLE
Get-RubrikOracleDB -Name OracleDB1 -DetailedObject
This will return the Oracle DB object with all properties, including additional details such as snapshots taken of the Oracle DB. Using this switch parameter negatively affects performance as more API queries will be performed.
#>

[CmdletBinding()]
Param(
# Name of the Oracle DB
[Parameter(Position = 0,ValueFromPipelineByPropertyName = $true)]
[String]$Name,
# Filter results to include only relic (removed) Oracle DBs
[Alias('is_relic')]
[Switch]$Relic,
[Alias('is_live_mount')]
[Switch]$LiveMount,
# DetailedObject will retrieved the detailed VM object, the default behavior of the API is to only retrieve a subset of the full VM object unless we query directly by ID. Using this parameter does affect performance as more data will be retrieved and more API-queries will be performed.
[Switch]$DetailedObject,
# SLA Domain policy assigned to the Oracle DB
[String]$SLA,
# Filter by SLA Domain assignment type
[Alias('sla_assignment')]
[ValidateSet('Derived', 'Direct','Unassigned')]
[String]$SLAAssignment,
# Filter the summary information based on the primarycluster_id of the primary Rubrik cluster. Use **_local** as the primary_cluster_id of the Rubrik cluster that is hosting the current REST API session.
[Alias('primary_cluster_id')]
[String]$PrimaryClusterID,
# Oracle DB id
[Parameter(ValueFromPipelineByPropertyName = $true)]
[String]$id,
# SLA id value
[Alias('effective_sla_domain_id')]
[String]$SLAID,
# 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 {

#region One-off
if ($SLAID.Length -eq 0 -and $SLA.Length -gt 0) {
$SLAID = Test-RubrikSLA -SLA $SLA -Inherit $Inherit -DoNotProtect $DoNotProtect
}
#endregion

$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

# If the Get-RubrikOracleDB function has been called with the -DetailedObject parameter a separate API query will be performed if the initial query was not based on ID
if (($DetailedObject) -and (-not $PSBoundParameters.containskey('id'))) {
for ($i = 0; $i -lt $result.Count; $i++) {
$Percentage = [int]($i/$result.count*100)
Write-Progress -Activity "DetailedObject queries in Progress, $($i+1) out of $($result.count)" -Status "$Percentage% Complete:" -PercentComplete $Percentage
Get-RubrikOracleDB -id $result[$i].id
}
} else {
return $result
}

} # End of process
} # End of function
6 changes: 3 additions & 3 deletions Rubrik/Rubrik.psd1
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ FunctionsToExport = @('Connect-Rubrik', 'Disconnect-Rubrik', 'Export-RubrikDatab
'Get-RubrikFilesetTemplate', 'Get-RubrikHost', 'Get-RubrikHyperVVM',
'Get-RubrikLDAP', 'Get-RubrikLogShipping', 'Get-RubrikManagedVolume',
'Get-RubrikManagedVolumeExport', 'Get-RubrikMount',
'Get-RubrikNASShare', 'Get-RubrikNutanixVM', 'Get-RubrikOrganization',
'Get-RubrikNASShare', 'Get-RubrikNutanixVM',
'Get-RubrikOracleDB', 'Get-RubrikOrganization',
'Get-RubrikReport', 'Get-RubrikReportData', 'Get-RubrikRequest',
'Get-RubrikSetting', 'Get-RubrikSLA', 'Get-RubrikSnapshot',
'Get-RubrikSoftwareVersion', 'Get-RubrikSQLInstance',
Expand Down Expand Up @@ -172,5 +173,4 @@ PrivateData = @{
# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix.
# DefaultCommandPrefix = ''

}

}
67 changes: 67 additions & 0 deletions Tests/Get-RubrikOracleDB.Tests.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
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/Get-RubrikOracleDB' -Tag 'Public', 'Get-RubrikOracleDB' -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 'Parameter/SLA' {
Mock -CommandName Test-RubrikConnection -Verifiable -ModuleName 'Rubrik' -MockWith {}
Mock -CommandName Get-RubrikSLA -Verifiable -ModuleName 'Rubrik' -MockWith {
@{ 'id' = 'test-sla_id' }
}
Mock -CommandName Submit-Request -Verifiable -ModuleName 'Rubrik' -MockWith {
@{
'name' = 'test-oracledb1'
'effectiveSlaDomainName' = 'test-valid_sla_name'
},
@{ # The server-side filter should not return this record, but this record will validate the response filter logic
'name' = 'test-oracledb2'
'effectiveSlaDomainName' = 'test-invalid_sla_name'
}
}
It -Name 'should overwrite $SLAID' -Test {
( Get-RubrikOracleDB -SLA 'test-valid_sla_name' ).Name |
Should -BeExactly 'test-oracledb1'
}
Assert-VerifiableMock
Assert-MockCalled -CommandName Test-RubrikConnection -ModuleName 'Rubrik' -Times 1
Assert-MockCalled -CommandName Get-RubrikSLA -ModuleName 'Rubrik' -Times 1
Assert-MockCalled -CommandName Submit-Request -ModuleName 'Rubrik' -Times 1
}

Context -Name 'Parameter/SLAID' {
Mock -CommandName Test-RubrikConnection -Verifiable -ModuleName 'Rubrik' -MockWith {}
Mock -CommandName Submit-Request -Verifiable -ModuleName 'Rubrik' -MockWith {
@{
'name' = 'test-oracledb1'
'effectiveSlaDomainName' = 'test-valid_sla_name'
}
}
It -Name 'SLAID Query should return OracleDB1 DB' -Test {
( Get-RubrikOracleDB -SLAID 'test-valid_sla_id' ).Name |
Should -BeExactly 'test-oracledb1'
}
It -Name 'SLAID Query should return OracleDB1 SLA' -Test {
( Get-RubrikOracleDB -SLAID 'test-valid_sla_id' ).effectiveSlaDomainName |
Should -BeExactly 'test-valid_sla_name'
}
Assert-VerifiableMock
Assert-MockCalled -CommandName Test-RubrikConnection -ModuleName 'Rubrik' -Times 1
Assert-MockCalled -CommandName Submit-Request -ModuleName 'Rubrik' -Times 1
}
}
58 changes: 58 additions & 0 deletions Tests/New-RubrikSnapshot.Tests.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
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/New-RubrikSnapshot' -Tag 'Public', 'New-RubrikSnapshot' -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 'Parameters' {
Mock -CommandName Test-RubrikConnection -Verifiable -ModuleName 'Rubrik' -MockWith {}
Mock -CommandName Test-RubrikSLA -Verifiable -ModuleName 'Rubrik' -MockWith {
@{
'slaid' = '11111'
}
}
Mock -CommandName Test-QueryParam -Verifiable -ModuleName 'Rubrik' -MockWith {
@{
'slaid' = 'https://server/api/internal/oracle/database/11111/snapshot'
}
}
Mock -CommandName Submit-Request -Verifiable -ModuleName 'Rubrik' -MockWith {
@{
'id' = 'CREATE_ORACLE_SNAPSHOT_11111'
'status' = 'QUEUED'
'progress' = '0'
}
}
It -Name 'Should Return status of QUEUED' -Test {
( New-RubrikSnapshot -id 1 -SLA 'Gold' -Confirm:$false).status |
Should -BeExactly 'QUEUED'
}
Context -Name 'Parameter Validation' {
It -Name 'Parameter id cannot be $null or empty' -Test {
{ New-RubrikSnapshot -id $null } |
Should -Throw "Cannot bind argument to parameter 'id' because it is an empty string."
}

}
Assert-VerifiableMock
Assert-MockCalled -CommandName Test-RubrikConnection -ModuleName 'Rubrik' -Times 1
Assert-MockCalled -CommandName Test-RubrikSLA -ModuleName 'Rubrik' -Times 1
Assert-MockCalled -CommandName Test-QueryParam -ModuleName 'Rubrik' -Times 1
Assert-MockCalled -CommandName Submit-Request -ModuleName 'Rubrik' -Times 1
}
}