-
Notifications
You must be signed in to change notification settings - Fork 87
/
Get-RubrikDatabase.ps1
201 lines (172 loc) · 8.78 KB
/
Get-RubrikDatabase.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#requires -Version 3
function Get-RubrikDatabase
{
<#
.SYNOPSIS
Retrieves details on one or more databases known to a Rubrik cluster
.DESCRIPTION
The Get-RubrikDatabase cmdlet is used to pull a detailed data set from a Rubrik cluster on any number of databases.
To narrow down the results, use the host and instance parameters to limit your search to a smaller group of objects.
Alternatively, supply the Rubrik database ID to return only one specific database.
.NOTES
Written by Chris Wahl for community usage
Twitter: @ChrisWahl
GitHub: chriswahl
.LINK
https://rubrik.gitbook.io/rubrik-sdk-for-powershell/command-documentation/reference/get-rubrikdatabase
.EXAMPLE
Get-RubrikDatabase -Name 'DB1' -SLA Gold
This will return details on all databases named DB1 protected by the Gold SLA Domain on any known host or instance.
.EXAMPLE
Get-RubrikDatabase -Name 'DB1' -DetailedObject
This will return the Database object with all properties, including additional details such as snapshots taken of the database and recovery point date/time information. Using this switch parameter negatively affects performance
.EXAMPLE
Get-RubrikDatabase -Name 'DB1' -Host 'Host1' -Instance 'MSSQLSERVER'
This will return details on a database named "DB1" living on an instance named "MSSQLSERVER" on the host named "Host1".
.EXAMPLE
Get-RubrikDatabase -Relic
This will return all removed databases that were formerly protected by Rubrik.
.EXAMPLE
Get-RubrikDatabase -Relic:$false
This will return all databases that are currently protected by Rubrik.
.EXAMPLE
Get-RubrikDatabase
This will return all databases that are currently or formerly protected by Rubrik.
.EXAMPLE
Get-RubrikDatabase -id 'MssqlDatabase:::aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'
This will return details on a single database matching the Rubrik ID of "MssqlDatabase:::aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
Note that the database ID is globally unique and is often handy to know if tracking a specific database for longer workflows,
whereas some values are not unique (such as nearly all hosts having one or more databases named "model") and more difficult to track by name.
.EXAMPLE
Get-RubrikDatabase -InstanceID MssqlInstance:::aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
This will return details on a single SQL instance matching the Rubrik ID of "MssqlInstance:::aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
.EXAMPLE
Get-RubrikDatabase -AvailabilityGroupName BestAvailabilityGroup
This will return all databases in the BestAvailabilityGroup AG. If it matches multiple availability group names it will default to querying by host name instead
.EXAMPLE
Get-RubrikDatabase -AvailabilityGroupID 'MssqlAvailabilityGroup:::12345678-1234-abcd-8910-abbaabcdef90'
Query for databases by availability group ID
#>
[CmdletBinding(DefaultParameterSetName = 'Query')]
Param(
# Rubrik's database id value
[Parameter(
ParameterSetName='ID',
Position = 0,
Mandatory = $true,
ValueFromPipelineByPropertyName = $true)]
[ValidateNotNullOrEmpty()]
[String]$id,
# Name of the database
[Alias('Database')]
[Parameter(
ParameterSetName='Query',
Position = 0)]
[String]$Name,
# Filter results to include only relic (removed) databases
[Alias('is_relic')]
[Switch]$Relic,
# SLA Domain policy assigned to the database
[String]$SLA,
# Name of the database instance
[String]$Instance,
# Name of the database host
[String]$Hostname,
#ServerInstance name (combined hostname\instancename)
[String]$ServerInstance,
#SQL InstanceID, used as a unique identifier
[Alias('instance_id')]
[string]$InstanceID,
# Availability Group Name
[String]$AvailabilityGroupName,
# SQL AvailabilityGroupID, used as a unique identifier
[Alias('availability_group_id')]
[string]$AvailabilityGroupID,
# 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,
# SLA id value
[Alias('effective_sla_domain_id')]
[String]$SLAID,
# DetailedObject will retrieved the detailed database object, the default behavior of the API is to only retrieve a subset of the database 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,
# 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)"
#region one-off
if($ServerInstance){
$SIobj = ConvertFrom-SqlServerInstance $ServerInstance
$Hostname = $SIobj.hostname
$Instance = $SIobj.instancename
}
if($Hostname.Length -gt 0 -and $Instance.Length -gt 0 -and $InstanceID.Length -eq 0){
$InstanceID = (Get-RubrikSQLInstance -Hostname $Hostname -Name $Instance).id
}
if($PSBoundParameters.ContainsKey('AvailabilityGroupName')){
$AvailabilityGroupID = (Get-RubrikAvailabilityGroup -GroupName $AvailabilityGroupName).id
if ($AvailabilityGroupID.count -gt 1) {
Write-Warning -Message 'Multiple availability group ids detected, querying by HostName instead'
$HostName = $AvailabilityGroupName
} elseif ([string]::IsNullOrEmpty($AvailabilityGroupID)) {
Write-Warning -Message 'Availability Group Name does not match existing availability group, please verify the AG name.'
$AvailabilityGroupID = 'MssqlAvailabilityGroup:::12345678-1234-abcd-8910-999999999999'
}
$PSBoundParameters.Add('AvailabilityGroupID',$AvailabilityGroupID)
}
#endregion
}
Process {
# If connected to RSC, redirect to new GQL cmdlet
if ($global:rubrikConnection.RSCInstance) {
Write-Verbose -Message "Cluster connected to RSC instance, redirecting to Get-RubrikRSCDatabase"
$response = Get-RubrikRSCDatabase @PSBoundParameters
return $response
}
#region One-off
# If SLA paramter defined, resolve SLAID
If ($SLA) {
$TestSlaSplat = @{
SLA = $SLA
Inherit = $Inherit
DoNotProtect = $DoNotProtect
}
if ($PrimaryClusterID) {
$TestSlaSplat.PrimaryClusterID = $PrimaryClusterID
}
$SLAID = Test-RubrikSLA @TestSlaSplat
}
#endregion
# If the switch parameter was not explicitly specified remove from query params
if(-not $PSBoundParameters.ContainsKey('Relic')) {
$Resources.Query.Remove('is_relic')
}
$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
$result = Set-ObjectTypeName -TypeName $resources.ObjectTName -result $result
# If the Get-RubrikDatabase 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'))) {
Write-Verbose -Message "DetailedObject detected, requerying for more detailed results"
$result = Get-RubrikDetailedResult -result $result -cmdlet "$($MyInvocation.MyCommand.Name)"
}
return $result
} # End of process
} # End of function