diff --git a/CHANGELOG.md b/CHANGELOG.md index de53f4b31..b8d66fb66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +## 2019-09-19 + +### Added [Cmdlets to manage Rubrik users] + +* Added Get-RubrikUser, New-RubrikUser, Remove-RubrikUser and Set-RubrikUser and respective unit tests to manage user accounts. +* Addresses [Issue 244](https://github.com/rubrikinc/rubrik-sdk-for-powershell/issues/244) + ## 2019-09-12 ### Changed [Added ability to rename Managed Volumes] diff --git a/Rubrik/Private/Get-RubrikAPIData.ps1 b/Rubrik/Private/Get-RubrikAPIData.ps1 index 79d674474..a23f5ec43 100644 --- a/Rubrik/Private/Get-RubrikAPIData.ps1 +++ b/Rubrik/Private/Get-RubrikAPIData.ps1 @@ -354,6 +354,21 @@ function Get-RubrikAPIData($endpoint) { Success = '200' } } + 'Get-RubrikUser' = @{ + '1.0' = @{ + Description = 'Retrieves settings related to a given user within the Rubrik cluster' + URI = '/api/internal/user' + Method = 'Get' + Body = '' + Query = @{ + username = 'username' + auth_domain_id = 'auth_domain_id' + } + Result = '' + Filter = '' + Success = '200' + } + } 'Get-RubrikManagedVolume' = @{ '1.0' = @{ Description = 'Returns a list of summary information for Rubrik Managed Volumes' @@ -1188,6 +1203,26 @@ function Get-RubrikAPIData($endpoint) { Success = '201' } } + 'New-RubrikUser' = @{ + '1.0' = @{ + Description = 'Creates a new Rubrik user.' + URI = '/api/internal/user' + Method = 'Post' + Body = @{ + username = 'username' + password = 'password' + firstName = 'firstName' + lastName = 'lastName' + emailAddress = 'emailAddress' + contactNumber = 'contactNumber' + mfaServerId = 'mfaServerId' + } + Query = '' + Result = '' + Filter = '' + Success = '200' + } + } 'New-RubrikSnapshot' = @{ '1.0' = @{ Description = 'Create an on-demand snapshot for the given object ID' @@ -1863,6 +1898,25 @@ function Get-RubrikAPIData($endpoint) { Success = '200' } } + 'Set-RubrikUser' = @{ + '1.0' = @{ + Description = 'Updates a Rubrik user.' + URI = '/api/internal/user/{id}' + Method = 'Patch' + Body = @{ + password = 'password' + firstName = 'firstName' + lastName = 'lastName' + emailAddress = 'emailAddress' + contactNumber = 'contactNumber' + mfaServerId = 'mfaServerId' + } + Query = '' + Result = '' + Filter = '' + Success = '200' + } + } 'Set-RubrikVM' = @{ '1.0' = @{ Description = 'Update VM with specified properties' @@ -2031,6 +2085,18 @@ function Get-RubrikAPIData($endpoint) { Success = '202' } } + 'Remove-RubrikUser' = @{ + '1.0' = @{ + Description = 'Deletes a specified user from the Rubrik cluster' + URI = '/api/internal/user/{id}' + Method = 'Delete' + Body = '' + Query = '' + Result = '' + Filter = '' + Success = '200' + } + } 'Set-RubrikLogShipping' = @{ '1.0' = @{ Description = 'Update a specified log shipping configuration' diff --git a/Rubrik/Public/Get-RubrikUser.ps1 b/Rubrik/Public/Get-RubrikUser.ps1 new file mode 100644 index 000000000..da4efdd2f --- /dev/null +++ b/Rubrik/Public/Get-RubrikUser.ps1 @@ -0,0 +1,97 @@ +#requires -Version 3 +function Get-RubrikUser +{ + <# + .SYNOPSIS + Gets settings of a Rubrik user + + .DESCRIPTION + The Get-RubrikUser cmdlet is used to query the Rubrik cluster to retrieve a list of settings around a Rubrik user account. + + .NOTES + Written by Mike Preston for community usage + Twitter: @mwpreston + GitHub: mwpreston + + .LINK + http://rubrikinc.github.io/rubrik-sdk-for-powershell/reference/Get-RubrikUser.html + + .EXAMPLE + Get-RubrikUser + This will return settings of all of the user accounts (local and LDAP) configured within the Rubrik cluster. + + .EXAMPLE + Get-RubrikUser -authDomainId 'local' + This will return settings of all of the user accounts belonging to the local authoriation domain. + + .EXAMPLE + Get-RubrikUser -username 'john.doe' + This will return settings for the user account with the username of john.doe configured within the Rubrik cluster. + + .EXAMPLE + Get-RubrikUser -authDomainId '1111-222-333' + This will return settings of all of the user accounts belonging to the specified authoriation domain. + + .EXAMPLE + Get-RubrikUser -id '1111-22222-33333-4444-5555' + This will return detailed information about the user with the specified ID. + #> + + [CmdletBinding()] + Param( + # Username to filter on + [Parameter(ParameterSetName='Query')] + [String] $Username, + # AuthDomainId to filter on + [Parameter(ParameterSetName='Query')] + [Alias('auth_domain_id')] + [String]$AuthDomainId, + # User ID + [Parameter(ParameterSetName='ID',Mandatory = $true,ValueFromPipelineByPropertyName = $true)] + [String]$Id, + # Rubrik server IP or FQDN + [Parameter(ParameterSetName='Query')] + [Parameter(ParameterSetName='ID')] + [String]$Server = $global:RubrikConnection.server, + # API version + [Parameter(ParameterSetName='Query')] + [Parameter(ParameterSetName='ID')] + [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 { + + # If local is passed for auth domain, get the local auth domain ID. + if ($AuthDomainId -eq 'local') { + $AuthDomainId = (Get-RubrikLDAP | Where-Object {$_.domainType -eq 'LOCAL'}).id + } + $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/Public/New-RubrikUser.ps1 b/Rubrik/Public/New-RubrikUser.ps1 new file mode 100644 index 000000000..b3c39ed07 --- /dev/null +++ b/Rubrik/Public/New-RubrikUser.ps1 @@ -0,0 +1,90 @@ +#requires -Version 3 +function New-RubrikUser +{ + <# + .SYNOPSIS + Creates a new user + + .DESCRIPTION + The New-RubrikUser cmdlet is used to create a new user within the Rubrik cluster. + NOTE: The underlying API endpoints used by this cmdlet are restricted. API token authentication cannot be used with this cmdlet. You must use username/password authentication. + + .NOTES + Written by Mike Preston for community usage + Twitter: @mwpreston + GitHub: mwpreston + + .LINK + http://rubrikinc.github.io/rubrik-sdk-for-powershell/reference/New-RubrikUser.html + + .EXAMPLE + New-RubrikUser -Username 'jdoe' -password (ConvertTo-SecureString -String 'secretpassword123!secret' -asplaintext -force) + This will create a new user with a username of jdoe and the specified password + + .EXAMPLE + New-RubrikUser -Username 'jdoe' -password (ConvertTo-SecureString -String 'secretpassword123!secret' -asplaintext -force) -FirstName 'John' -LastName 'Doe' + This will create a new user with a username of jdoe, the specified password, firstname of John, and LastName as Doe + #> + + [CmdletBinding(SupportsShouldProcess = $true,ConfirmImpact = 'High')] + Param( + # Username to assign to the created user + [Parameter(Mandatory=$true)] + [ValidateNotNullorEmpty()] + [String]$Username, + # Password for newly created user + [Parameter(Mandatory=$true)] + [ValidateNotNullorEmpty()] + [SecureString]$Password, + # Users first name + [String]$FirstName, + #Users last name + [String]$LastName, + #Users email + [String]$EmailAddress, + #Users Contact Number + [String]$ContactNumber, + #MFA Server ID associated to user + [String]$MfaServerId, + # 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 { + + # Convert SecureString password to send to API endpoint as string + [String]$Password = [String](New-Object PSCredential "user",$Password).GetNetworkCredential().Password + + $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/Public/Remove-RubrikUser.ps1 b/Rubrik/Public/Remove-RubrikUser.ps1 new file mode 100644 index 000000000..eaa753861 --- /dev/null +++ b/Rubrik/Public/Remove-RubrikUser.ps1 @@ -0,0 +1,73 @@ +#requires -Version 3 +function Remove-RubrikUser +{ + <# + .SYNOPSIS + Removes a Rubrik user + + .DESCRIPTION + The Remove-RubrikUser cmdlet is used to remove a user from the Rubrik cluster. + + .NOTES + Written by Mike Preston for community usage + Twitter: @mwpreston + GitHub: mwpreston + + .LINK + http://rubrikinc.github.io/rubrik-sdk-for-powershell/reference/Remove-RubrikUser.html + + .EXAMPLE + Remove-RubrikUser -id "11111111-2222-3333-4444-555555555555" + This will remove the user matching id "11111111-2222-3333-4444-555555555555". + + .EXAMPLE + Get-RubrikUser -Username 'john.doe' | Remove-RubrikUser + This will remove the user with the matching username of john.doe + + #> + + [CmdletBinding(SupportsShouldProcess = $true,ConfirmImpact = 'High')] + Param( + # ID of user to remove. + [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName = $true)] + [ValidateNotNullOrEmpty()] + [String]$Id, + # 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 { + + $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/Public/Set-RubrikUser.ps1 b/Rubrik/Public/Set-RubrikUser.ps1 new file mode 100644 index 000000000..8ddad99b2 --- /dev/null +++ b/Rubrik/Public/Set-RubrikUser.ps1 @@ -0,0 +1,87 @@ +#requires -Version 3 +function Set-RubrikUser +{ + <# + .SYNOPSIS + Updates an existing user + + .DESCRIPTION + The Set-RubrikUser cmdlet is used to update the attributes of an existing Rubrik user. + NOTE: The underlying API endpoints used by this cmdlet are restricted. API token authentication cannot be used with this cmdlet. You must use username/password authentication. + + .NOTES + Written by Mike Preston for community usage + Twitter: @mwpreston + GitHub: mwpreston + + .LINK + http://rubrikinc.github.io/rubrik-sdk-for-powershell/reference/Set-RubrikUser.html + + .EXAMPLE + Set-RubrikUser -id '11111' -password (ConvertTo-SecureString -string 'supersecretpassword' -asplaintext -force) + This will set the specified password for the user account with the specified id. + + .EXAMPLE + Set-RubrikUser -id '11111' -LastName 'Smith' + This will change the user matching the specified id last name to 'Smith' + #> + + [CmdletBinding(SupportsShouldProcess = $true,ConfirmImpact = 'High')] + Param( + # User ID + [Parameter(Mandatory = $true,ValueFromPipelineByPropertyName = $true)] + [String]$Id, + # Password for the user + [SecureString]$Password, + # Users first name + [String]$FirstName, + #Users last name + [String]$LastName, + #Users email + [String]$EmailAddress, + #Users Contact Number + [String]$ContactNumber, + #MFA Server ID associated to user + [String]$MfaServerId, + # 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 { + + # Convert SecureString password to send to API endpoint as string + if ($null -ne $password) {[String]$Password = [String](New-Object PSCredential "user",$Password).GetNetworkCredential().Password} + + $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 8fb6e22bf..cefc6da5a 100755 --- a/Rubrik/Rubrik.psd1 +++ b/Rubrik/Rubrik.psd1 @@ -76,8 +76,8 @@ FunctionsToExport = @('Connect-Rubrik', 'Disconnect-Rubrik', 'Export-RubrikDatab 'Get-RubrikDatabaseFiles', 'Get-RubrikDatabaseMount', 'Get-RubrikDatabaseRecoverableRange', 'Get-RubrikEvent', 'Get-RubrikFileset', 'Get-RubrikFilesetTemplate', 'Get-RubrikHost', - 'Get-RubrikHyperVVM', 'Get-RubrikLDAP', 'Get-RubrikLogShipping', - 'Get-RubrikManagedVolume', 'Get-RubrikManagedVolumeExport', + 'Get-RubrikHyperVVM', 'Get-RubrikLDAP', 'Get-RubrikUser', + 'Get-RubrikLogShipping', 'Get-RubrikManagedVolume', 'Get-RubrikManagedVolumeExport', 'Get-RubrikMount', 'Get-RubrikNASShare', 'Get-RubrikNutanixVM', 'Get-RubrikOracleDB', 'Get-RubrikOrganization', 'Get-RubrikReport', 'Get-RubrikReportData', 'Get-RubrikRequest', 'Get-RubrikSetting', @@ -93,8 +93,8 @@ FunctionsToExport = @('Connect-Rubrik', 'Disconnect-Rubrik', 'Export-RubrikDatab 'New-RubrikLogBackup', 'New-RubrikLogShipping', 'New-RubrikManagedVolume', 'New-RubrikManagedVolumeExport', 'New-RubrikMount', 'New-RubrikNASShare', 'New-RubrikReport', - 'New-RubrikSLA', 'New-RubrikSnapshot', 'New-RubrikVCenter', - 'New-RubrikVMDKMount', 'New-RubrikVolumeGroupMount', + 'New-RubrikSLA', 'New-RubrikSnapshot', 'New-RubrikUser', + 'New-RubrikVCenter', 'New-RubrikVMDKMount', 'New-RubrikVolumeGroupMount', 'Protect-RubrikDatabase', 'Protect-RubrikFileset', 'Protect-RubrikHyperVVM', 'Protect-RubrikNutanixVM', 'Protect-RubrikTag', 'Protect-RubrikVM', @@ -104,7 +104,7 @@ FunctionsToExport = @('Connect-Rubrik', 'Disconnect-Rubrik', 'Export-RubrikDatab 'Remove-RubrikManagedVolume', 'Remove-RubrikManagedVolumeExport', 'Remove-RubrikMount', 'Remove-RubrikNASShare', 'Remove-RubrikReport', 'Remove-RubrikSLA', 'Remove-RubrikUnmanagedObject', - 'Remove-RubrikVCenter', 'Remove-RubrikVMSnapshot', + 'Remove-RubrikVCenter', 'Remove-RubrikVMSnapshot', 'Remove-RubrikUser', 'Remove-RubrikVolumeGroupMount', 'Reset-RubrikLogShipping', 'Restore-RubrikDatabase', 'Set-RubrikAvailabilityGroup', 'Set-RubrikBlackout', 'Set-RubrikDatabase', 'Set-RubrikHyperVVM', @@ -112,7 +112,7 @@ FunctionsToExport = @('Connect-Rubrik', 'Disconnect-Rubrik', 'Export-RubrikDatab 'Set-RubrikNASShare', 'Set-RubrikNutanixVM', 'Set-RubrikSetting', 'Set-RubrikSLA', 'Set-RubrikSQLInstance', 'Set-RubrikSupportTunnel', 'Set-RubrikVCenter', 'Set-RubrikVM', 'Set-RubrikVolumeFilterDriver', - 'Start-RubrikManagedVolumeSnapshot', + 'Set-RubrikUser', 'Start-RubrikManagedVolumeSnapshot', 'Stop-RubrikManagedVolumeSnapshot', 'Sync-RubrikAnnotation', 'Sync-RubrikTag', 'Update-RubrikHost', 'Update-RubrikVCenter', 'Update-RubrikVMwareVM') diff --git a/Tests/Get-RubrikUser.Tests.ps1 b/Tests/Get-RubrikUser.Tests.ps1 new file mode 100644 index 000000000..e0de8e824 --- /dev/null +++ b/Tests/Get-RubrikUser.Tests.ps1 @@ -0,0 +1,82 @@ +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-RubrikUser' -Tag 'Public', 'Get-RubrikUser' -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 'Returned Results' { + Mock -CommandName Test-RubrikConnection -Verifiable -ModuleName 'Rubrik' -MockWith {} + Mock -CommandName Get-RubrikLDAP -Verifiable -ModuleName 'Rubrik' -MockWith { + @{ + 'id' = '1234-1234' + 'name' = 'LOCAL' + } + } + Mock -CommandName Submit-Request -Verifiable -ModuleName 'Rubrik' -MockWith { + @{ + 'username' = 'jdoe' + 'id' = 'User:11111' + 'authDomainId' = '1234-1234' + 'emailAddress' = 'jdoe@localhost.local' + }, + @{ + 'username' = 'jsmith' + 'id' = 'User:11112' + 'authDomainId' = '1234-1234' + 'emailAddress' = 'jsmith@localhost.local' + }, @{ + 'username' = 'dba' + 'id' = 'User:111113' + 'authDomainId' = '1234-5555' + 'emailAddress' = 'dba@localhost.local' + } + } + It -Name 'No parameters returns all results' -Test { + ( Get-RubrikUser).Count | + Should -BeExactly 3 + } + It -Name 'Trigger Get-RubrikLDAP' -Test { + ( Get-RubrikUser -authDomainId 'local').Count | + Should -BeExactly 3 + } + + Assert-VerifiableMock + Assert-MockCalled -CommandName Test-RubrikConnection -ModuleName 'Rubrik' -Times 1 + Assert-MockCalled -CommandName Get-RubrikLDAP -ModuleName 'Rubrik' -Times 1 + Assert-MockCalled -CommandName Submit-Request -ModuleName 'Rubrik' -Times 2 + } + Context -Name 'Parameter Validation' { + It -Name 'ID Missing' -Test { + { Get-RubrikUser -id } | + Should -Throw "Missing an argument for parameter 'id'. Specify a parameter of type 'System.String' and try again." + } + It -Name 'Username must be System.String' -Test { + { Get-RubrikUser -UserName } | + Should -Throw "Missing an argument for parameter 'UserName'. Specify a parameter of type 'System.String' and try again." + } + It -Name 'AuthDomainId must be System.String' -Test { + { Get-RubrikUser -authDomainId } | + Should -Throw "Missing an argument for parameter 'authDomainId'. Specify a parameter of type 'System.String' and try again." + } + It -Name 'Validate Parameter Set' -Test { + { Get-RubrikUser -Username 'test' -id 'test' } | + Should -Throw "Parameter set cannot be resolved using the specified named parameters." + } + + } +} \ No newline at end of file diff --git a/Tests/New-RubrikUser.Tests.ps1 b/Tests/New-RubrikUser.Tests.ps1 new file mode 100644 index 000000000..ec670e1c4 --- /dev/null +++ b/Tests/New-RubrikUser.Tests.ps1 @@ -0,0 +1,50 @@ +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-RubrikUser' -Tag 'Public', 'New-RubrikUser' -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 'Returned Results' { + Mock -CommandName Test-RubrikConnection -Verifiable -ModuleName 'Rubrik' -MockWith {} + Mock -CommandName Submit-Request -Verifiable -ModuleName 'Rubrik' -MockWith { + @{ + 'username' = 'jdoe' + 'id' = 'User:11111' + 'authDomainId' = '1234-1234' + } + } + It -Name 'User is created' -Test { + ( New-RubrikUser -Username 'jdoe' -password (ConvertTo-SecureString -String 'testpass' -AsPlainText -Force)).UserName | + Should -BeExactly 'jdoe' + } + + 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 'Missing Username' -Test { + { Get-RubrikUser -username } | + Should -Throw "Missing an argument for parameter 'Username'. Specify a parameter of type 'System.String' and try again." + } + It -Name 'Missing Password' -Test { + { Get-RubrikUser -password } | + Should -Throw "A parameter cannot be found that matches parameter name 'password'" + } + } +} \ No newline at end of file diff --git a/Tests/Remove-RubrikUser.Tests.ps1 b/Tests/Remove-RubrikUser.Tests.ps1 new file mode 100644 index 000000000..7a7a80ab0 --- /dev/null +++ b/Tests/Remove-RubrikUser.Tests.ps1 @@ -0,0 +1,40 @@ +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/Remove-RubrikUser' -Tag 'Public', 'Remove-RubrikUser' -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 'Returned Results' { + Mock -CommandName Test-RubrikConnection -Verifiable -ModuleName 'Rubrik' -MockWith {} + Mock -CommandName Submit-Request -Verifiable -ModuleName 'Rubrik' { return 'OK'} + It -Name 'User removed' -Test { + Remove-RubrikUser -Id 'test' | + Should -BeExactly 'OK' + } + + 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 'ID Missing' -Test { + { Remove-RubrikUser -id } | + Should -Throw "Missing an argument for parameter 'id'. Specify a parameter of type 'System.String' and try again." + } + } +} \ No newline at end of file diff --git a/Tests/Set-RubrikUser.Tests.ps1 b/Tests/Set-RubrikUser.Tests.ps1 new file mode 100644 index 000000000..214882eac --- /dev/null +++ b/Tests/Set-RubrikUser.Tests.ps1 @@ -0,0 +1,54 @@ +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/Set-RubrikUser' -Tag 'Public', 'Set-RubrikUser' -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 'Returned Results' { + Mock -CommandName Test-RubrikConnection -Verifiable -ModuleName 'Rubrik' -MockWith {} + Mock -CommandName Submit-Request -Verifiable -ModuleName 'Rubrik' -MockWith { + @{ + 'username' = 'jdoe' + 'id' = 'User:11111' + 'authDomainId' = '1234-1234' + 'emailAddress' = 'jdoe@localhost.local' + 'firstName' = 'John' + 'lastName' = 'Doe' + + } + } + It -Name 'User is updated' -Test { + ( Set-RubrikUser -id 'User:11111' -firstName 'John').firstName | + Should -BeExactly "John" + } + + 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 'ID Missing' -Test { + { Set-RubrikUser -id } | + Should -Throw "Missing an argument for parameter 'id'. Specify a parameter of type 'System.String' and try again." + } + It -Name 'Password must be System.SecureString' -Test { + { Set-RubrikUser -id 'User:::11111' -Password 'newpassword' } | + Should -Throw "Cannot process argument transformation on parameter 'Password'." + } + } +} \ No newline at end of file