Public/New-RubrikBootStrap.ps1
#Requires -Version 3 function New-RubrikBootStrap { <# .SYNOPSIS Send a Rubrik Bootstrap Request .DESCRIPTION This will send a bootstrap request .NOTES #DNS Param must be an array even if only passing a single server #NTP Must be an array than contains hash table for each server object #Nodeconfigs Param must be a hash table object. .LINK https://rubrik.gitbook.io/rubrik-sdk-for-powershell/command-documentation/reference/new-rubrikbootstrap .EXAMPLE https://gist.github.com/nshores/104f069570740ea645d67a8aeab19759 New-RubrikBootStrap -Server 169.254.11.25 -name 'rubrik-edge' -dnsNameservers @('192.168.11.1') -dnsSearchDomains @('corp.us','branch.corp.us') -ntpserverconfigs @(@{server = 'pool.ntp.org'}) -adminUserInfo @{emailAddress = 'nick@shoresmedia.com'; id ='admin'; password = 'P@SSw0rd!'} -nodeconfigs @{node1 = @{managementIpConfig = @{address = '192.168.11.1'; gateway = '192.168.11.100'; netmask = '255.255.255.0'}}} .EXAMPLE $BootStrapHash = @{ Server = 169.254.11.25 name = 'rubrik-edge' dnsNameservers = @('192.168.11.1') dnsSearchDomains = @('corp.us','branch.corp.us') ntpserverconfigs = @(@{server = 'pool.ntp.org'}) adminUserInfo = @{emailAddress = 'nick@shoresmedia.com'; id ='admin'; password = 'P@SSw0rd!'} nodeconfigs = @{node1 = @{managementIpConfig = @{address = '192.168.11.1'; gateway = '192.168.11.100'; netmask = '255.255.255.0'}}} } New-RubrikBootStrap @BootStrapHash #> [CmdletBinding()] Param( # ID of the Rubrik cluster or me for self [ValidateNotNullOrEmpty()] [String] $id, # Rubrik server IP or FQDN [ValidateNotNullOrEmpty()] [String] $Server, # Admin User Info Hashtable [Parameter(Mandatory = $true)] [ValidateScript({ $requiredProperties = @("emailAddress","id","password") ForEach($item in $requiredProperties) { if(!$_.ContainsKey($item)) { Throw "adminUserInfo missing property $($item)" } if([string]::IsNullOrEmpty($_[$item])) { Throw "adminUserInfo $($item) is null or empty" } } return $true })] [ValidateNotNullOrEmpty()] [Object] $adminUserInfo, # Node Configuration Hashtable [Parameter(Mandatory = $true)] [ValidateScript({ if ('HashTable' -ne $_.GetType().Name) { Throw "node configuration should be a hashtable, refer to the documentation on how to structure a bootstrap request" } $requiredProperties = @("address","gateway","netmask") ForEach($node in $_.Keys) { $ipConfig = $_[$node].managementIpConfig ForEach($item in $requiredProperties) { if(!$ipConfig.ContainsKey($item)) { Throw "node configuration for $($node) missing property $($item)" } if([string]::IsNullOrEmpty($ipConfig[$item])) { Throw "node configuration for $($node) value $($item) is null or empty" } } } return $true })] [ValidateNotNullOrEmpty()] [System.Object] $nodeConfigs, # Software Encryption [switch] $enableSoftwareEncryptionAtRest, # Cluster/Edge Name [ValidateNotNullOrEmpty()] [string] $name, # NTP Servers $ntpServerConfigs, # DNS Servers [String[]] $dnsNameservers, # DNS Search Domains [String[]] $dnsSearchDomains ) 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 # 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 there is more than node node, update the API data to contain all data for all nodes if($nodeConfigs.Count -gt 1) { ForEach($key in $nodeConfigs.Keys) { $resources.Body.nodeConfigs[$key] = $nodeConfigs[$key] } } # Default DNS servers to 8.8.8.8 if([string]::IsNullOrEmpty($dnsNameServers)) { $dnsNameServers = @( '8.8.8.8' ) } # Default DNS search domains to an empty array if([string]::IsNullOrEmpty($dnsSearchDomains)) { $dnsSearchDomains = @() } # Default NTP servers to pool.ntp.org if($ntpServerConfigs.Length -lt 1) { $ntpServerConfigs = @( @{ server = 'pool.ntp.org' } ) } #endregion } Process { #region oneoff $id = "me" # Construct Body based on parameters $resources.Body.adminUserInfo = $adminUserInfo $resources.Body.dnsNameservers = $dnsNameservers if($dnsSearchDomains.Length -ne 0) { $resources.Body.dnsSearchDomains = $dnsSearchDomains } else { $resources.Body.Remove('dnsSearchDomains') } if($enableSoftwareEncryptionAtRest) { $resources.Body.enableSoftwareEncryptionAtRest = $true } else { $resources.Body.enableSoftwareEncryptionAtRest = $false } $resources.Body.name = $name $resources.Body.nodeConfigs = $nodeConfigs $resources.Body.ntpServerConfigs = $ntpServerConfigs $body = ConvertTo-Json -InputObject $resources.Body -Depth 4 Write-Verbose -Message "Bootstrap REST Request Body `n$($body)" #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 @{"content-type"="application/json"} -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 |