From f25cda2bf244fab484dc4661c5b912413497bc21 Mon Sep 17 00:00:00 2001 From: "s.pawluk" Date: Mon, 10 Apr 2017 11:46:11 +0200 Subject: [PATCH 01/16] Fixed nested modules import --- DSCClassResources/SBAuthorizationRule/SBAuthorizationRule.psd1 | 2 +- DSCClassResources/SBFarm/SBFarm.psd1 | 2 +- DSCClassResources/SBHost/SBHost.psd1 | 2 +- DSCClassResources/SBMessageContainer/SBMessageContainer.psd1 | 2 +- DSCClassResources/SBNamespace/SBNamespace.psd1 | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/DSCClassResources/SBAuthorizationRule/SBAuthorizationRule.psd1 b/DSCClassResources/SBAuthorizationRule/SBAuthorizationRule.psd1 index ab3ef35..3062336 100644 --- a/DSCClassResources/SBAuthorizationRule/SBAuthorizationRule.psd1 +++ b/DSCClassResources/SBAuthorizationRule/SBAuthorizationRule.psd1 @@ -58,7 +58,7 @@ PowerShellVersion = '5.0' # FormatsToProcess = @() # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess -NestedModules = @( '..\..\Modules\SB.Util\SB.Util.psd1' ) +NestedModules = @( '..\..\Modules\SB.Util\SB.Util.psm1' ) # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. # FunctionsToExport = @() diff --git a/DSCClassResources/SBFarm/SBFarm.psd1 b/DSCClassResources/SBFarm/SBFarm.psd1 index 6b90256..e5ccf3a 100644 --- a/DSCClassResources/SBFarm/SBFarm.psd1 +++ b/DSCClassResources/SBFarm/SBFarm.psd1 @@ -58,7 +58,7 @@ PowerShellVersion = '5.0' # FormatsToProcess = @() # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess -NestedModules = @( '..\..\Modules\SB.Util\SB.Util.psd1' ) +NestedModules = @( '..\..\Modules\SB.Util\SB.Util.psm1' ) # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. # FunctionsToExport = @() diff --git a/DSCClassResources/SBHost/SBHost.psd1 b/DSCClassResources/SBHost/SBHost.psd1 index 6f5e6f2..c089831 100644 --- a/DSCClassResources/SBHost/SBHost.psd1 +++ b/DSCClassResources/SBHost/SBHost.psd1 @@ -58,7 +58,7 @@ PowerShellVersion = '5.0' # FormatsToProcess = @() # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess -NestedModules = @( '..\..\Modules\SB.Util\SB.Util.psd1' ) +NestedModules = @( '..\..\Modules\SB.Util\SB.Util.psm1' ) # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. # FunctionsToExport = @() diff --git a/DSCClassResources/SBMessageContainer/SBMessageContainer.psd1 b/DSCClassResources/SBMessageContainer/SBMessageContainer.psd1 index fb44569..a21c87d 100644 --- a/DSCClassResources/SBMessageContainer/SBMessageContainer.psd1 +++ b/DSCClassResources/SBMessageContainer/SBMessageContainer.psd1 @@ -58,7 +58,7 @@ PowerShellVersion = '5.0' # FormatsToProcess = @() # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess -NestedModules = @( '..\..\Modules\SB.Util\SB.Util.psd1' ) +NestedModules = @( '..\..\Modules\SB.Util\SB.Util.psm1' ) # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. # FunctionsToExport = @() diff --git a/DSCClassResources/SBNamespace/SBNamespace.psd1 b/DSCClassResources/SBNamespace/SBNamespace.psd1 index dd65c2c..2ecda7d 100644 --- a/DSCClassResources/SBNamespace/SBNamespace.psd1 +++ b/DSCClassResources/SBNamespace/SBNamespace.psd1 @@ -58,7 +58,7 @@ PowerShellVersion = '5.0' # FormatsToProcess = @() # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess -NestedModules = @( '..\..\Modules\SB.Util\SB.Util.psd1' ) +NestedModules = @( '..\..\Modules\SB.Util\SB.Util.psm1' ) # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. # FunctionsToExport = @() From c4a1b41845839705a190ec3ac85112b317ea698c Mon Sep 17 00:00:00 2001 From: "s.pawluk" Date: Mon, 10 Apr 2017 12:36:45 +0200 Subject: [PATCH 02/16] fixed #38 Command not found when try to create SBFarm --- ServiceBusForWindowsServerDsc.psd1 | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/ServiceBusForWindowsServerDsc.psd1 b/ServiceBusForWindowsServerDsc.psd1 index 0e4870e..65242ae 100644 --- a/ServiceBusForWindowsServerDsc.psd1 +++ b/ServiceBusForWindowsServerDsc.psd1 @@ -78,7 +78,18 @@ NestedModules = @( ) # Functions to export from this module -FunctionsToExport = @() +FunctionsToExport = @('Test-SBParameterState', + 'ConvertTo-PlainText', + 'New-SqlConnectionString', + 'Get-SqlConnectionStringPropertyValue', + 'Compare-SecureString', + 'Get-AccountName', + 'Get-AccountDomainName', + 'Get-DistinguishedNameForDomain', + 'Get-FullyQualifiedDomainName', + 'Get-NetBIOSDomainName', + 'Format-AccountName', + 'Compare-AccountName') # Cmdlets to export from this module CmdletsToExport = @() From 743879d4c2a9f5b363dac9b248de295ae3f85021 Mon Sep 17 00:00:00 2001 From: "s.pawluk" Date: Mon, 10 Apr 2017 14:04:54 +0200 Subject: [PATCH 03/16] Reverted function export. --- ServiceBusForWindowsServerDsc.psd1 | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/ServiceBusForWindowsServerDsc.psd1 b/ServiceBusForWindowsServerDsc.psd1 index 65242ae..0e4870e 100644 --- a/ServiceBusForWindowsServerDsc.psd1 +++ b/ServiceBusForWindowsServerDsc.psd1 @@ -78,18 +78,7 @@ NestedModules = @( ) # Functions to export from this module -FunctionsToExport = @('Test-SBParameterState', - 'ConvertTo-PlainText', - 'New-SqlConnectionString', - 'Get-SqlConnectionStringPropertyValue', - 'Compare-SecureString', - 'Get-AccountName', - 'Get-AccountDomainName', - 'Get-DistinguishedNameForDomain', - 'Get-FullyQualifiedDomainName', - 'Get-NetBIOSDomainName', - 'Format-AccountName', - 'Compare-AccountName') +FunctionsToExport = @() # Cmdlets to export from this module CmdletsToExport = @() From 115f8e3f98410b93802990a3c6beb621d2e9cf19 Mon Sep 17 00:00:00 2001 From: "s.pawluk" Date: Mon, 10 Apr 2017 15:23:11 +0200 Subject: [PATCH 04/16] Fixed Missing parameter on auto generated certificate --- DSCClassResources/SBFarm/SBFarm.psm1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DSCClassResources/SBFarm/SBFarm.psm1 b/DSCClassResources/SBFarm/SBFarm.psm1 index 7e2ad06..917c97d 100644 --- a/DSCClassResources/SBFarm/SBFarm.psm1 +++ b/DSCClassResources/SBFarm/SBFarm.psm1 @@ -539,6 +539,8 @@ class SBFarm : SBBase { Write-Verbose -Message "CertificateAutoGenerationKey is present, swapping pscredential for securestring" $newSBFarmParams.Remove("CertificateAutoGenerationKey") + $newSBFarmParams.Remove("FarmCertificateThumbprint") + $newSBFarmParams.Remove("EncryptionCertificateThumbprint") $newSBFarmParams.CertificateAutoGenerationKey = $this.CertificateAutoGenerationKey.Password } From 10afa8d19f3662a0c6320a14baea4ff57c55ce3f Mon Sep 17 00:00:00 2001 From: "s.pawluk" Date: Tue, 11 Apr 2017 08:43:53 +0200 Subject: [PATCH 05/16] Properly importing New-SqlConnectionString Fixed [Get]SBFarm throwing "You cannot call a method on a null-valued expression" --- DSCClassResources/SBFarm/SBFarm.psm1 | 1 + DSCClassResources/SBHost/SBHost.psm1 | 1 + Modules/SB.Util/SB.Util.psm1 | 5 +++++ 3 files changed, 7 insertions(+) diff --git a/DSCClassResources/SBFarm/SBFarm.psm1 b/DSCClassResources/SBFarm/SBFarm.psm1 index 917c97d..9ab00ac 100644 --- a/DSCClassResources/SBFarm/SBFarm.psm1 +++ b/DSCClassResources/SBFarm/SBFarm.psm1 @@ -1,4 +1,5 @@ using module ..\SBBase +Using module ..\..\Modules\SB.Util\SB.Util.psd1 <# SBFarm creates a new farm and sets certain settings for a Service Bus for Windows Server farm. diff --git a/DSCClassResources/SBHost/SBHost.psm1 b/DSCClassResources/SBHost/SBHost.psm1 index 70525cb..1b8b01a 100644 --- a/DSCClassResources/SBHost/SBHost.psm1 +++ b/DSCClassResources/SBHost/SBHost.psm1 @@ -1,4 +1,5 @@ using module ..\SBBase +Using module ..\..\Modules\SB.Util\SB.Util.psd1 <# SBHost adds and removes a host from a farm, and starts, stops and updates settings for a Service Bus for diff --git a/Modules/SB.Util/SB.Util.psm1 b/Modules/SB.Util/SB.Util.psm1 index e8c30d8..71428c7 100644 --- a/Modules/SB.Util/SB.Util.psm1 +++ b/Modules/SB.Util/SB.Util.psm1 @@ -141,6 +141,11 @@ function Test-SBParameterState() $KeyList | ForEach-Object -Process { if ($_ -ne "Verbose") { + if(($DesiredValues.ContainsKey($_) -eq $true) -and ($CurrentValues.$_ -ne $DesiredValues.$_)) + { + return $true + } + if (($CurrentValues.ContainsKey($_) -eq $false) ` -or ($CurrentValues.$_ -ne $DesiredValues.$_) ` -or (($DesiredValues.ContainsKey($_) -eq $true) -and ($DesiredValues.$_.GetType().IsArray))) From ea359ff81b2e05c69d1f934d42e18dce6f1eabd7 Mon Sep 17 00:00:00 2001 From: "s.pawluk" Date: Tue, 11 Apr 2017 09:52:47 +0200 Subject: [PATCH 06/16] Fixed [Test]SBNamespace. It can use local user groups without domain name --- .../SBNamespace/SBNamespace.psm1 | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/DSCClassResources/SBNamespace/SBNamespace.psm1 b/DSCClassResources/SBNamespace/SBNamespace.psm1 index d78790c..f604a23 100644 --- a/DSCClassResources/SBNamespace/SBNamespace.psm1 +++ b/DSCClassResources/SBNamespace/SBNamespace.psm1 @@ -1,4 +1,5 @@ using module ..\SBBase +Using module ..\..\Modules\SB.Util\SB.Util.psd1 <# SBNamespace adds, removes and updates settings for a Service Bus for Windows Server namespace. @@ -237,11 +238,18 @@ class SBNameSpace : SBBase $formattedManageUsers = @() $formattedManageUsers = $ManageUsers | ForEach-Object{ - $formatAccountNameParams = @{ - FullAccountNameWithDomain = $_ - Format = 'UserLogonNamePreWindows2000' + if($this.IsLocalGroup($_)) + { + return $_.ToLower() + } + else + { + $formatAccountNameParams = @{ + FullAccountNameWithDomain = $_ + Format = 'UserLogonNamePreWindows2000' + } + (Format-AccountName @formatAccountNameParams).ToLower() } - (Format-AccountName @formatAccountNameParams).ToLower() } return $formattedManageUsers @@ -401,4 +409,11 @@ class SBNameSpace : SBBase Write-Verbose -Message "Invoking Set-SBNamespace with configurable params" Set-SBNamespace @setSBNamespaceParams } + + [bool] IsLocalGroup([string] $Name) + { + $gwmiResult = (gwmi -class Win32_Group -filter "LocalAccount='True'" | where { $_.Name -eq $Name }) + + return -not($gwmiResult -eq $null) + } } From fc9aa93fe34a901a7a749277341800138a64323f Mon Sep 17 00:00:00 2001 From: "s.pawluk" Date: Tue, 11 Apr 2017 10:36:33 +0200 Subject: [PATCH 07/16] Fixed tests --- Modules/SB.Util/SB.Util.psm1 | 2 +- Tests/Unit/SB.Util.Tests.ps1 | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/Modules/SB.Util/SB.Util.psm1 b/Modules/SB.Util/SB.Util.psm1 index 71428c7..4cafad2 100644 --- a/Modules/SB.Util/SB.Util.psm1 +++ b/Modules/SB.Util/SB.Util.psm1 @@ -141,7 +141,7 @@ function Test-SBParameterState() $KeyList | ForEach-Object -Process { if ($_ -ne "Verbose") { - if(($DesiredValues.ContainsKey($_) -eq $true) -and ($CurrentValues.$_ -ne $DesiredValues.$_)) + if(($DesiredValues.ContainsKey($_) -eq $true) -and ($CurrentValues.$_ -eq $DesiredValues.$_)) { return $true } diff --git a/Tests/Unit/SB.Util.Tests.ps1 b/Tests/Unit/SB.Util.Tests.ps1 index d46a3d9..4cb40f5 100644 --- a/Tests/Unit/SB.Util.Tests.ps1 +++ b/Tests/Unit/SB.Util.Tests.ps1 @@ -74,6 +74,32 @@ try Test-SBParameterState -CurrentValues $current -DesiredValues $desired | Should Be $false } + It "Returns true when values are empty" { + # Arrange + $current = @{ + Example = "" + } + $desired = @{ + Example = "" + } + + # Act | Assert + Test-SBParameterState -CurrentValues $current -DesiredValues $desired | Should Be $true + } + + It "Returns true when values are null" { + # Arrange + $current = @{ + Example = $null + } + $desired = @{ + Example = $null + } + + # Act | Assert + Test-SBParameterState -CurrentValues $current -DesiredValues $desired | Should Be $true + } + It "Returns false when a value is missing" { # Arrange $current = @{} From a8027475d6ed179d3c62d3977ef3a205b6a4d647 Mon Sep 17 00:00:00 2001 From: "s.pawluk" Date: Tue, 11 Apr 2017 10:40:17 +0200 Subject: [PATCH 08/16] Fixed PSSA suggestions --- DSCClassResources/SBNamespace/SBNamespace.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DSCClassResources/SBNamespace/SBNamespace.psm1 b/DSCClassResources/SBNamespace/SBNamespace.psm1 index f604a23..13ee2d3 100644 --- a/DSCClassResources/SBNamespace/SBNamespace.psm1 +++ b/DSCClassResources/SBNamespace/SBNamespace.psm1 @@ -412,8 +412,8 @@ class SBNameSpace : SBBase [bool] IsLocalGroup([string] $Name) { - $gwmiResult = (gwmi -class Win32_Group -filter "LocalAccount='True'" | where { $_.Name -eq $Name }) + $gwmiResult = (Get-WmiObject -class Win32_Group -filter "LocalAccount='True'" | Where-Object { $_.Name -eq $Name }) - return -not($gwmiResult -eq $null) + return -not($null -eq $gwmiResult) } } From f8501781d00e96677cb8ddc9295730c2e2e2bcaf Mon Sep 17 00:00:00 2001 From: "s.pawluk" Date: Tue, 11 Apr 2017 10:51:21 +0200 Subject: [PATCH 09/16] Ping CI From 852569ede655f5f4cde235a263e3a0d9a42e2d7c Mon Sep 17 00:00:00 2001 From: "s.pawluk" Date: Tue, 11 Apr 2017 11:12:24 +0200 Subject: [PATCH 10/16] Fixed tests, updates app veyor config --- Modules/SB.Util/SB.Util.psm1 | 1 + Tests/Unit/SB.Util.Tests.ps1 | 10 ++----- Tests/Unit/SBAuthorizationRule.Tests.ps1 | 9 +++--- Tests/Unit/SBFarm.Tests.ps1 | 9 +++--- Tests/Unit/SBHost.Tests.ps1 | 36 +++++++++++++----------- Tests/Unit/SBHostCEIP.Tests.ps1 | 7 +++-- Tests/Unit/SBMessageContainer.Tests.ps1 | 7 +++-- Tests/Unit/SBNamespace.Tests.ps1 | 9 +++--- Tests/Unit/SBRuntimeSetting.Tests.ps1 | 9 +++--- appveyor.yml | 4 +-- 10 files changed, 52 insertions(+), 49 deletions(-) diff --git a/Modules/SB.Util/SB.Util.psm1 b/Modules/SB.Util/SB.Util.psm1 index 4cafad2..e9a3131 100644 --- a/Modules/SB.Util/SB.Util.psm1 +++ b/Modules/SB.Util/SB.Util.psm1 @@ -256,6 +256,7 @@ function Test-SBParameterState() } } } + Write-Verbose "Return [$returnValue]" return $returnValue } diff --git a/Tests/Unit/SB.Util.Tests.ps1 b/Tests/Unit/SB.Util.Tests.ps1 index 4cb40f5..045a4aa 100644 --- a/Tests/Unit/SB.Util.Tests.ps1 +++ b/Tests/Unit/SB.Util.Tests.ps1 @@ -76,28 +76,22 @@ try It "Returns true when values are empty" { # Arrange - $current = @{ - Example = "" - } $desired = @{ Example = "" } # Act | Assert - Test-SBParameterState -CurrentValues $current -DesiredValues $desired | Should Be $true + Test-SBParameterState -CurrentValues $desired -DesiredValues $desired | Should Be $true } It "Returns true when values are null" { # Arrange - $current = @{ - Example = $null - } $desired = @{ Example = $null } # Act | Assert - Test-SBParameterState -CurrentValues $current -DesiredValues $desired | Should Be $true + Test-SBParameterState -CurrentValues $desired -DesiredValues $desired | Should Be $true } It "Returns false when a value is missing" { diff --git a/Tests/Unit/SBAuthorizationRule.Tests.ps1 b/Tests/Unit/SBAuthorizationRule.Tests.ps1 index d7620b4..c67bffa 100644 --- a/Tests/Unit/SBAuthorizationRule.Tests.ps1 +++ b/Tests/Unit/SBAuthorizationRule.Tests.ps1 @@ -48,11 +48,12 @@ try $testSBAuthorizationRule.NamespaceName = "TestNamespace" $testSBAuthorizationRule.Ensure = 'Present' - Mock New-SBAuthorizationRule {} - Mock Remove-SBAuthorizationRule {} - Mock Set-SBAuthorizationRule {} - Describe 'SBAuthorizationRule' { + + Mock New-SBAuthorizationRule {} + Mock Remove-SBAuthorizationRule {} + Mock Set-SBAuthorizationRule {} + Context "No authorization rule exists for a given name and namespace and should be created" { # Arrange Mock Get-SBAuthorizationRule { diff --git a/Tests/Unit/SBFarm.Tests.ps1 b/Tests/Unit/SBFarm.Tests.ps1 index 7b73272..54666c6 100644 --- a/Tests/Unit/SBFarm.Tests.ps1 +++ b/Tests/Unit/SBFarm.Tests.ps1 @@ -61,11 +61,12 @@ try } $testSBFarm.TenantApiCredentials = New-Object @tenantApiCredentialParams - Mock New-SBFarm {} - Mock Set-SBFarm {} - Mock Stop-SBFarm {} - Describe 'SBFarm' { + + Mock New-SBFarm {} + Mock Set-SBFarm {} + Mock Stop-SBFarm {} + Context "No farm is found or configured" { #Arrange Mock Get-SBFarm { diff --git a/Tests/Unit/SBHost.Tests.ps1 b/Tests/Unit/SBHost.Tests.ps1 index f311ca8..86ea45d 100644 --- a/Tests/Unit/SBHost.Tests.ps1 +++ b/Tests/Unit/SBHost.Tests.ps1 @@ -59,28 +59,30 @@ try $testSBHost.SBFarmDBConnectionStringDataSource = "SQLSERVER.contoso.com" $testSBHost.Started = $true - Mock Add-SBHost {} - Mock Remove-SBHost {} - Mock Start-SBHost {} - Mock Stop-SBHost {} - Mock Update-SBHost {} - Mock Get-CimInstance { - [CmdletBinding()] - param - ( - [Parameter(Mandatory)] - [string] - $ClassName - ) - return @{ - Domain = 'contoso.com' - } - } $env:COMPUTERNAME = "servicebus03" $hostName = "$env:COMPUTERNAME.$((Get-CimInstance -ClassName WIN32_ComputerSystem).Domain)" Describe 'SBHost' { + + Mock Add-SBHost {} + Mock Remove-SBHost {} + Mock Start-SBHost {} + Mock Stop-SBHost {} + Mock Update-SBHost {} + Mock Get-CimInstance { + [CmdletBinding()] + param + ( + [Parameter(Mandatory)] + [string] + $ClassName + ) + return @{ + Domain = 'contoso.com' + } + } + Context "Current host is not joined to farm and should be joined and started" { #Arrange Mock Get-SBFarm { diff --git a/Tests/Unit/SBHostCEIP.Tests.ps1 b/Tests/Unit/SBHostCEIP.Tests.ps1 index 5aecbb0..69f6812 100644 --- a/Tests/Unit/SBHostCEIP.Tests.ps1 +++ b/Tests/Unit/SBHostCEIP.Tests.ps1 @@ -65,10 +65,11 @@ try " Prompt you with additional messages that might interrupt your work." ) - Mock Enable-SBHostCEIP {} - Mock Disable-SBHostCEIP {} - Describe 'SBHostCEIP' { + + Mock Enable-SBHostCEIP {} + Mock Disable-SBHostCEIP {} + Context "Customer Experience Improvement Program telemetry is disabled and should be enabled" { # Arrange Mock Get-SBHostCEIP { diff --git a/Tests/Unit/SBMessageContainer.Tests.ps1 b/Tests/Unit/SBMessageContainer.Tests.ps1 index 0771e69..10ce6a1 100644 --- a/Tests/Unit/SBMessageContainer.Tests.ps1 +++ b/Tests/Unit/SBMessageContainer.Tests.ps1 @@ -48,10 +48,11 @@ try $testSBMessageContainer.ContainerDBConnectionStringInitialCatalog = "SBMessageContainer02" $testSBMessageContainer.Ensure = 'Present' - Mock New-SBMessageContainer {} - Mock Remove-SBMessageContainer {} - Describe 'SBMessageContainer' { + + Mock New-SBMessageContainer {} + Mock Remove-SBMessageContainer {} + Context "No container exists for a given database name" { # Arrange Mock Get-SBMessageContainer { diff --git a/Tests/Unit/SBNamespace.Tests.ps1 b/Tests/Unit/SBNamespace.Tests.ps1 index 88743ba..41367c2 100644 --- a/Tests/Unit/SBNamespace.Tests.ps1 +++ b/Tests/Unit/SBNamespace.Tests.ps1 @@ -55,11 +55,12 @@ try $testSBNamespace.SecondarySymmetricKey = "RvxwTxTctasdf6KzKNfjQzjaV7oc53yUDl08ZUXQrFU=" $testSBNamespace.SubscriptionId = "00000000000000000000000000000000" - Mock New-SBNamespace {} - Mock Set-SBNamespace {} - Mock Remove-SBNamespace {} - Describe 'SBNamespace' { + + Mock New-SBNamespace {} + Mock Set-SBNamespace {} + Mock Remove-SBNamespace {} + Context "No namespace exists for a given name and should be created" { # Arrange Mock Get-SBNamespace { diff --git a/Tests/Unit/SBRuntimeSetting.Tests.ps1 b/Tests/Unit/SBRuntimeSetting.Tests.ps1 index 5a7b9a6..086195d 100644 --- a/Tests/Unit/SBRuntimeSetting.Tests.ps1 +++ b/Tests/Unit/SBRuntimeSetting.Tests.ps1 @@ -44,11 +44,12 @@ try # Arrange $testSBRuntimeSetting = [SBRuntimeSetting]::new() - Mock Set-SBRuntimeSetting {} - Mock Stop-SBFarm {} - Mock Start-SBFarm {} - Describe 'SBRuntimeSetting' { + + Mock New-SBNamespace {} + Mock Set-SBNamespace {} + Mock Remove-SBNamespace {} + Context "Runtime setting exists and needs to be updated" { # Arrange Mock Get-SBRuntimeSetting { diff --git a/appveyor.yml b/appveyor.yml index 607da38..9e68f34 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,7 +1,7 @@ #---------------------------------# # environment configuration # #---------------------------------# -version: 0.10.0.{build} +version: 0.10.1.{build} install: - git clone https://github.com/PowerShell/DscResource.Tests - ps: | @@ -13,7 +13,7 @@ install: #---------------------------------# # build configuration # #---------------------------------# -image: WMF 5 +image: Visual Studio 2017 build: false #---------------------------------# From c69f79a6befd955aa848f6b4ee0e6f37948e3c1f Mon Sep 17 00:00:00 2001 From: "s.pawluk" Date: Tue, 11 Apr 2017 11:20:07 +0200 Subject: [PATCH 11/16] fixed PSSA --- DSCClassResources/SBNamespace/SBNamespace.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DSCClassResources/SBNamespace/SBNamespace.psm1 b/DSCClassResources/SBNamespace/SBNamespace.psm1 index 13ee2d3..4b29b26 100644 --- a/DSCClassResources/SBNamespace/SBNamespace.psm1 +++ b/DSCClassResources/SBNamespace/SBNamespace.psm1 @@ -412,8 +412,8 @@ class SBNameSpace : SBBase [bool] IsLocalGroup([string] $Name) { - $gwmiResult = (Get-WmiObject -class Win32_Group -filter "LocalAccount='True'" | Where-Object { $_.Name -eq $Name }) + $cimResult = (Get-CimInstance -class Win32_Group -filter "LocalAccount='True'" | Where-Object { $_.Name -eq $Name }) - return -not($null -eq $gwmiResult) + return -not($null -eq $cimResult) } } From 50574acbd765a70b20125549a5e0fbcff1fa0bc9 Mon Sep 17 00:00:00 2001 From: "s.pawluk" Date: Tue, 11 Apr 2017 11:26:46 +0200 Subject: [PATCH 12/16] try install pester from different source --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 9e68f34..47331ec 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -8,7 +8,7 @@ install: Import-Module -Name .\DscResource.Tests\TestHelper.psm1 -Force Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force Install-Module -Name xCertificate -Repository PSGallery -Force - Install-Module -Name Pester -Repository PSGallery -Force + - cinst pester #---------------------------------# # build configuration # From e987a8042cb1a197452020169aa662b750fdd4e8 Mon Sep 17 00:00:00 2001 From: "s.pawluk" Date: Tue, 11 Apr 2017 15:09:21 +0200 Subject: [PATCH 13/16] Fixed tests finally --- DSCClassResources/SBFarm/SBFarm.psm1 | 6 +++--- DSCClassResources/SBNamespace/SBNamespace.psm1 | 10 +++++----- Examples/Single Server/ServiceBusForWindowsServer.ps1 | 2 +- Modules/SB.Util/SB.Util.psm1 | 8 ++++++-- Tests/Unit/SBNamespace.Tests.ps1 | 1 - Tests/Unit/SBRuntimeSetting.Tests.ps1 | 3 +++ 6 files changed, 18 insertions(+), 12 deletions(-) diff --git a/DSCClassResources/SBFarm/SBFarm.psm1 b/DSCClassResources/SBFarm/SBFarm.psm1 index 89b7e08..4fc6917 100644 --- a/DSCClassResources/SBFarm/SBFarm.psm1 +++ b/DSCClassResources/SBFarm/SBFarm.psm1 @@ -560,14 +560,14 @@ class SBFarm : SBBase if ($null -ne $CertificateThumbprint) { $newSBFarmParams.FarmCertificateThumbprint = $CertificateThumbprint - + if ($null -eq $this.EncryptionCertificateThumbprint) { $newSBFarmParams.EncryptionCertificateThumbprint = $CertificateThumbprint } } } - + } else { @@ -659,7 +659,7 @@ class SBFarm : SBBase $newSBFarmParams.Remove("SBFarmDBConnectionStringIntegratedSecurity") $newSBFarmParams.Remove("SBFarmDBConnectionStringCredential") $newSBFarmParams.Remove("SBFarmDBConnectionStringEncrypt") - + Write-Verbose -Message "Removing FarmCertificateSubject regardless of if it was used" $newSBFarmParams.Remove("FarmCertificateSubject") diff --git a/DSCClassResources/SBNamespace/SBNamespace.psm1 b/DSCClassResources/SBNamespace/SBNamespace.psm1 index 4b29b26..5af8f68 100644 --- a/DSCClassResources/SBNamespace/SBNamespace.psm1 +++ b/DSCClassResources/SBNamespace/SBNamespace.psm1 @@ -5,7 +5,7 @@ Using module ..\..\Modules\SB.Util\SB.Util.psd1 SBNamespace adds, removes and updates settings for a Service Bus for Windows Server namespace. #> [DscResource()] -class SBNameSpace : SBBase +class SBNamespace : SBBase { <# @@ -176,17 +176,17 @@ class SBNameSpace : SBBase return $true } - [bool] SBNamespaceShouldBeCreated([SBNameSpace] $CurrentValues) + [bool] SBNamespaceShouldBeCreated([SBNamespace] $CurrentValues) { return (($this.Ensure -eq [Ensure]::Present) -and ($CurrentValues.Ensure -eq [Ensure]::Absent)) } - [bool] SBNamespaceShouldBeRemoved([SBNameSpace] $CurrentValues) + [bool] SBNamespaceShouldBeRemoved([SBNamespace] $CurrentValues) { return (($this.Ensure -eq [Ensure]::Absent) -and ($CurrentValues.Ensure -eq [Ensure]::Present)) } - [bool] SBNamespaceShouldBeUpdated([SBNameSpace] $CurrentValues) + [bool] SBNamespaceShouldBeUpdated([SBNamespace] $CurrentValues) { $currentValuesHt = $CurrentValues.ToHashtable() @@ -240,7 +240,7 @@ class SBNameSpace : SBBase $formattedManageUsers = $ManageUsers | ForEach-Object{ if($this.IsLocalGroup($_)) { - return $_.ToLower() + $_.ToLower() } else { diff --git a/Examples/Single Server/ServiceBusForWindowsServer.ps1 b/Examples/Single Server/ServiceBusForWindowsServer.ps1 index 46a19d0..50a1784 100644 --- a/Examples/Single Server/ServiceBusForWindowsServer.ps1 +++ b/Examples/Single Server/ServiceBusForWindowsServer.ps1 @@ -230,7 +230,7 @@ Configuration Example DependsOn = '[SBFarm]ContosoSBFarm' PsDscRunAsCredential = $DomainInstallAccount Ensure = 'Present' - Name = $ConfigurationData.NonNodeData.ServiceBus.SBNameSpaces.ContosoNamespace + Name = $ConfigurationData.NonNodeData.ServiceBus.SBNamespaces.ContosoNamespace ManageUsers = $DomainInstallAccount.UserName } diff --git a/Modules/SB.Util/SB.Util.psm1 b/Modules/SB.Util/SB.Util.psm1 index e9a3131..f4de1d6 100644 --- a/Modules/SB.Util/SB.Util.psm1 +++ b/Modules/SB.Util/SB.Util.psm1 @@ -143,7 +143,7 @@ function Test-SBParameterState() { if(($DesiredValues.ContainsKey($_) -eq $true) -and ($CurrentValues.$_ -eq $DesiredValues.$_)) { - return $true + break } if (($CurrentValues.ContainsKey($_) -eq $false) ` @@ -254,9 +254,13 @@ function Test-SBParameterState() } } } + + if($returnValue -eq $false) + { + break + } } } - Write-Verbose "Return [$returnValue]" return $returnValue } diff --git a/Tests/Unit/SBNamespace.Tests.ps1 b/Tests/Unit/SBNamespace.Tests.ps1 index 41367c2..b58ce6c 100644 --- a/Tests/Unit/SBNamespace.Tests.ps1 +++ b/Tests/Unit/SBNamespace.Tests.ps1 @@ -29,7 +29,6 @@ $TestEnvironment = Initialize-TestEnvironment ` function Invoke-TestSetup { $serviceBusCmdletModule = Join-Path -Path $PSScriptRoot -ChildPath "Stubs\ServiceBus\2.0.40512.2\Microsoft.ServiceBus.Commands.psm1" -Resolve Import-Module -Name $serviceBusCmdletModule -Scope 'Global' -Force - Import-Module -Name (Join-Path -Path $moduleRoot -ChildPath "Modules\SB.Util\SB.Util.psm1") -Scope 'Global' -Force } function Invoke-TestCleanup { diff --git a/Tests/Unit/SBRuntimeSetting.Tests.ps1 b/Tests/Unit/SBRuntimeSetting.Tests.ps1 index 086195d..2e758af 100644 --- a/Tests/Unit/SBRuntimeSetting.Tests.ps1 +++ b/Tests/Unit/SBRuntimeSetting.Tests.ps1 @@ -49,6 +49,9 @@ try Mock New-SBNamespace {} Mock Set-SBNamespace {} Mock Remove-SBNamespace {} + Mock Set-SBRuntimeSetting {} + Mock Start-SBFarm {} + Mock Stop-SBFarm {} Context "Runtime setting exists and needs to be updated" { # Arrange From d5334b63facbc666fda1d70b45b75178cea5c68c Mon Sep 17 00:00:00 2001 From: "s.pawluk" Date: Thu, 13 Apr 2017 08:39:24 +0200 Subject: [PATCH 14/16] SBFarm GatewayDBConnectionString can be null DesiredValues[$_] value can be null --- DSCClassResources/SBFarm/SBFarm.psm1 | 24 ++++++++++++++---------- Modules/SB.Util/SB.Util.psm1 | 19 ++++++++++++++----- Tests/Unit/SB.Util.Tests.ps1 | 26 ++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 15 deletions(-) diff --git a/DSCClassResources/SBFarm/SBFarm.psm1 b/DSCClassResources/SBFarm/SBFarm.psm1 index 4fc6917..1d8e5dd 100644 --- a/DSCClassResources/SBFarm/SBFarm.psm1 +++ b/DSCClassResources/SBFarm/SBFarm.psm1 @@ -414,17 +414,21 @@ class SBFarm : SBBase $result.GatewayDBConnectionString = $sbFarm.GatewayDBConnectionString $result.GatewayDBConnectionStringCredential = $this.GatewayDBConnectionStringCredential - $params = @{ - SqlConnectionString = $sbFarm.GatewayDBConnectionString + + if([string]::IsNullOrEmpty($sbFarm.GatewayDBConnectionString) -eq $false) + { + $params = @{ + SqlConnectionString = $sbFarm.GatewayDBConnectionString + } + $params.PropertyName = "Data Source" + $result.GatewayDBConnectionStringDataSource = [string](Get-SqlConnectionStringPropertyValue @params) + $params.PropertyName = "Encrypt" + $result.GatewayDBConnectionStringEncrypt = [bool](Get-SqlConnectionStringPropertyValue @params) + $params.PropertyName = "Initial Catalog" + $result.GatewayDBConnectionStringInitialCatalog = [string](Get-SqlConnectionStringPropertyValue @params) + $params.PropertyName = "Integrated Security" + $result.GatewayDBConnectionStringIntegratedSecurity = [string](Get-SqlConnectionStringPropertyValue @params) } - $params.PropertyName = "Data Source" - $result.GatewayDBConnectionStringDataSource = [string](Get-SqlConnectionStringPropertyValue @params) - $params.PropertyName = "Encrypt" - $result.GatewayDBConnectionStringEncrypt = [bool](Get-SqlConnectionStringPropertyValue @params) - $params.PropertyName = "Initial Catalog" - $result.GatewayDBConnectionStringInitialCatalog = [string](Get-SqlConnectionStringPropertyValue @params) - $params.PropertyName = "Integrated Security" - $result.GatewayDBConnectionStringIntegratedSecurity = [string](Get-SqlConnectionStringPropertyValue @params) $result.HttpsPort = $sbFarm.HttpsPort $result.InternalPortRangeStart = $sbFarm.ClusterConnectionEndpointPort diff --git a/Modules/SB.Util/SB.Util.psm1 b/Modules/SB.Util/SB.Util.psm1 index f4de1d6..74b31ae 100644 --- a/Modules/SB.Util/SB.Util.psm1 +++ b/Modules/SB.Util/SB.Util.psm1 @@ -163,6 +163,12 @@ function Test-SBParameterState() if ($CheckDesiredValue) { + if(($DesiredValues.$_ -eq $null) -and ($CurrentValues.$_ -ne $null)) + { + $returnValue = $false + break + } + $desiredType = $DesiredValues.$_.GetType() $fieldName = $_ if ($desiredType.IsArray -eq $true) @@ -421,16 +427,19 @@ function Get-SqlConnectionStringPropertyValue ) process { - $params = @{ - TypeName = 'System.Data.SqlClient.SqlConnectionStringBuilder' - ArgumentList = $SqlConnectionString - } - $sqlConnectionStringBuilder = New-Object @params if ($PropertyName -eq 'Integrated Security' -and $SqlConnectionString.Contains('Integrated Security=SSPI')) { return 'SSPI' } + + $params = @{ + TypeName = 'System.Data.SqlClient.SqlConnectionStringBuilder' + ArgumentList = $SqlConnectionString + } + + $sqlConnectionStringBuilder = New-Object @params + return $sqlConnectionStringBuilder[$PropertyName] } } diff --git a/Tests/Unit/SB.Util.Tests.ps1 b/Tests/Unit/SB.Util.Tests.ps1 index 045a4aa..dd32734 100644 --- a/Tests/Unit/SB.Util.Tests.ps1 +++ b/Tests/Unit/SB.Util.Tests.ps1 @@ -146,6 +146,32 @@ try # Act | Assert Test-SBParameterState -CurrentValues $current -DesiredValues $desired | Should Be $false } + + It "Returns false when current is null and desired is null" { + # Arrange + $current = @{ + Example = $null + } + $desired = @{ + Example = "test" + } + + # Act | Assert + Test-SBParameterState -CurrentValues $current -DesiredValues $desired | Should Be $false + } + + It "Returns false when current is empty string and desired is null" { + # Arrange + $current = @{ + Example = "" + } + $desired = @{ + Example = $null + } + + # Act | Assert + Test-SBParameterState -CurrentValues $current -DesiredValues $desired | Should Be $false + } } Context "Validate ConvertTo-PlainText" { From 582a385186f5b692fc69eeac3290c92142845f27 Mon Sep 17 00:00:00 2001 From: "s.pawluk" Date: Thu, 13 Apr 2017 09:08:00 +0200 Subject: [PATCH 15/16] PowerShell gotcha. Can't use break and continue in script block in ForEach-Object --- Modules/SB.Util/SB.Util.psm1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/SB.Util/SB.Util.psm1 b/Modules/SB.Util/SB.Util.psm1 index 74b31ae..ab957ae 100644 --- a/Modules/SB.Util/SB.Util.psm1 +++ b/Modules/SB.Util/SB.Util.psm1 @@ -143,7 +143,7 @@ function Test-SBParameterState() { if(($DesiredValues.ContainsKey($_) -eq $true) -and ($CurrentValues.$_ -eq $DesiredValues.$_)) { - break + return } if (($CurrentValues.ContainsKey($_) -eq $false) ` @@ -166,7 +166,7 @@ function Test-SBParameterState() if(($DesiredValues.$_ -eq $null) -and ($CurrentValues.$_ -ne $null)) { $returnValue = $false - break + return } $desiredType = $DesiredValues.$_.GetType() @@ -263,7 +263,7 @@ function Test-SBParameterState() if($returnValue -eq $false) { - break + return } } } From 5fd6e6099ffd81ce7493aba9c9ac3f5e3a17b94e Mon Sep 17 00:00:00 2001 From: "s.pawluk" Date: Thu, 13 Apr 2017 14:18:18 +0200 Subject: [PATCH 16/16] When SBFarm values are not set, it's returned as empty string --- DSCClassResources/SBFarm/SBFarm.psm1 | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/DSCClassResources/SBFarm/SBFarm.psm1 b/DSCClassResources/SBFarm/SBFarm.psm1 index 1d8e5dd..e0bcf40 100644 --- a/DSCClassResources/SBFarm/SBFarm.psm1 +++ b/DSCClassResources/SBFarm/SBFarm.psm1 @@ -499,8 +499,29 @@ class SBFarm : SBBase $currentValuesHt = $currentValues.ToHashtable() $desiredValuesHt = $this.ToHashtable() - $desiredValuesHt.AdminApiUserName = $desiredValuesHt.AdminApiCredentials.UserName - $desiredValuesHt.TenantApiUserName = $desiredValuesHt.TenantApiCredentials.UserName + + if([string]::IsNullOrEmpty($desiredValuesHt.FarmDNS)) + { + $desiredValuesHt.FarmDNS = "" + } + + if([string]::IsNullOrEmpty($desiredValuesHt.AdminApiCredentials.UserName)) + { + $desiredValuesHt.AdminApiUserName = "" + } + else + { + $desiredValuesHt.AdminApiUserName = $desiredValuesHt.AdminApiCredentials.UserName + } + + if([string]::IsNullOrEmpty($desiredValuesHt.TenantApiCredentials.UserName)) + { + $desiredValuesHt.TenantApiUserName = "" + } + else + { + $desiredValuesHt.TenantApiUserName = $desiredValuesHt.TenantApiCredentials.UserName + } $params = @{ CurrentValues = $currentValuesHt