Skip to content
This repository was archived by the owner on Jan 3, 2026. It is now read-only.
Open
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
Original file line number Diff line number Diff line change
Expand Up @@ -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 = @()
Expand Down
2 changes: 1 addition & 1 deletion DSCClassResources/SBFarm/SBFarm.psd1
Original file line number Diff line number Diff line change
Expand Up @@ -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 = @()
Expand Down
57 changes: 42 additions & 15 deletions DSCClassResources/SBFarm/SBFarm.psm1
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -413,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
Expand Down Expand Up @@ -494,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
Expand Down Expand Up @@ -559,20 +585,21 @@ class SBFarm : SBBase
if ($null -ne $CertificateThumbprint)
{
$newSBFarmParams.FarmCertificateThumbprint = $CertificateThumbprint

if ($null -eq $this.EncryptionCertificateThumbprint)
{
$newSBFarmParams.EncryptionCertificateThumbprint = $CertificateThumbprint
}
}
}

}
else
{
Write-Verbose -Message "CertificateAutoGenerationKey is present, swapping pscredential for securestring"
$newSBFarmParams.Remove("CertificateAutoGenerationKey")
$newSBFarmParams.Remove("FarmCertificateThumbprint")
$newSBFarmParams.Remove("EncryptionCertificateThumbprint")
$newSBFarmParams.CertificateAutoGenerationKey = $this.CertificateAutoGenerationKey.Password
}

Expand Down Expand Up @@ -657,7 +684,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")

Expand Down
2 changes: 1 addition & 1 deletion DSCClassResources/SBHost/SBHost.psd1
Original file line number Diff line number Diff line change
Expand Up @@ -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 = @()
Expand Down
1 change: 1 addition & 0 deletions DSCClassResources/SBHost/SBHost.psm1
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 = @()
Expand Down
2 changes: 1 addition & 1 deletion DSCClassResources/SBNamespace/SBNamespace.psd1
Original file line number Diff line number Diff line change
Expand Up @@ -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 = @()
Expand Down
31 changes: 23 additions & 8 deletions DSCClassResources/SBNamespace/SBNamespace.psm1
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
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.
#>
[DscResource()]
class SBNameSpace : SBBase
class SBNamespace : SBBase
{

<#
Expand Down Expand Up @@ -175,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()

Expand Down Expand Up @@ -237,11 +238,18 @@ class SBNameSpace : SBBase
$formattedManageUsers = @()

$formattedManageUsers = $ManageUsers | ForEach-Object{
$formatAccountNameParams = @{
FullAccountNameWithDomain = $_
Format = 'UserLogonNamePreWindows2000'
if($this.IsLocalGroup($_))
{
$_.ToLower()
}
else
{
$formatAccountNameParams = @{
FullAccountNameWithDomain = $_
Format = 'UserLogonNamePreWindows2000'
}
(Format-AccountName @formatAccountNameParams).ToLower()
}
(Format-AccountName @formatAccountNameParams).ToLower()
}

return $formattedManageUsers
Expand Down Expand Up @@ -401,4 +409,11 @@ class SBNameSpace : SBBase
Write-Verbose -Message "Invoking Set-SBNamespace with configurable params"
Set-SBNamespace @setSBNamespaceParams
}

[bool] IsLocalGroup([string] $Name)
{
$cimResult = (Get-CimInstance -class Win32_Group -filter "LocalAccount='True'" | Where-Object { $_.Name -eq $Name })

return -not($null -eq $cimResult)
}
}
2 changes: 1 addition & 1 deletion Examples/Single Server/ServiceBusForWindowsServer.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down
29 changes: 24 additions & 5 deletions Modules/SB.Util/SB.Util.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,11 @@ function Test-SBParameterState()
$KeyList | ForEach-Object -Process {
if ($_ -ne "Verbose")
{
if(($DesiredValues.ContainsKey($_) -eq $true) -and ($CurrentValues.$_ -eq $DesiredValues.$_))
{
return
}

if (($CurrentValues.ContainsKey($_) -eq $false) `
-or ($CurrentValues.$_ -ne $DesiredValues.$_) `
-or (($DesiredValues.ContainsKey($_) -eq $true) -and ($DesiredValues.$_.GetType().IsArray)))
Expand All @@ -158,6 +163,12 @@ function Test-SBParameterState()

if ($CheckDesiredValue)
{
if(($DesiredValues.$_ -eq $null) -and ($CurrentValues.$_ -ne $null))
{
$returnValue = $false
return
}

$desiredType = $DesiredValues.$_.GetType()
$fieldName = $_
if ($desiredType.IsArray -eq $true)
Expand Down Expand Up @@ -249,6 +260,11 @@ function Test-SBParameterState()
}
}
}

if($returnValue -eq $false)
{
return
}
}
}
return $returnValue
Expand Down Expand Up @@ -411,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]
}
}
Expand Down
46 changes: 46 additions & 0 deletions Tests/Unit/SB.Util.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,26 @@ try
Test-SBParameterState -CurrentValues $current -DesiredValues $desired | Should Be $false
}

It "Returns true when values are empty" {
# Arrange
$desired = @{
Example = ""
}

# Act | Assert
Test-SBParameterState -CurrentValues $desired -DesiredValues $desired | Should Be $true
}

It "Returns true when values are null" {
# Arrange
$desired = @{
Example = $null
}

# Act | Assert
Test-SBParameterState -CurrentValues $desired -DesiredValues $desired | Should Be $true
}

It "Returns false when a value is missing" {
# Arrange
$current = @{}
Expand Down Expand Up @@ -126,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" {
Expand Down
9 changes: 5 additions & 4 deletions Tests/Unit/SBAuthorizationRule.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
9 changes: 5 additions & 4 deletions Tests/Unit/SBFarm.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Loading