From 175d74420808325276de1b738143aa1edc19fca4 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 2 Nov 2017 11:24:01 -0500 Subject: [PATCH 01/42] Replace all instances of AlwaysOnAvailabilityGroup with "AOAG" --- .../MSFT_xSQLServerAOAG.psm1} | 0 .../MSFT_xSQLServerAOAG.schema.mof} | 4 ++-- .../MSFT_xSQLServerAOAGDatabaseMembership.psm1} | 2 +- .../MSFT_xSQLServerAOAGDatabaseMembership.schema.mof} | 4 ++-- .../en-US/MSFT_xSQLServerAOAGDatabaseMembership.strings.psd1} | 2 +- .../en-US/about_xSQLServerAOAGDatabaseMembership.help.txt} | 0 .../MSFT_xSQLServerAOAGReplica.psm1} | 0 .../MSFT_xSQLServerAOAGReplica.schema.mof} | 4 ++-- 8 files changed, 8 insertions(+), 8 deletions(-) rename DSCResources/{MSFT_xSQLServerAlwaysOnAvailabilityGroup/MSFT_xSQLServerAlwaysOnAvailabilityGroup.psm1 => MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.psm1} (100%) rename DSCResources/{MSFT_xSQLServerAlwaysOnAvailabilityGroup/MSFT_xSQLServerAlwaysOnAvailabilityGroup.schema.mof => MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.schema.mof} (96%) rename DSCResources/{MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.psm1 => MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.psm1} (99%) rename DSCResources/{MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.schema.mof => MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.schema.mof} (92%) rename DSCResources/{MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/en-US/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.strings.psd1 => MSFT_xSQLServerAOAGDatabaseMembership/en-US/MSFT_xSQLServerAOAGDatabaseMembership.strings.psd1} (92%) rename DSCResources/{MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/en-US/about_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.help.txt => MSFT_xSQLServerAOAGDatabaseMembership/en-US/about_xSQLServerAOAGDatabaseMembership.help.txt} (100%) rename DSCResources/{MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica/MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica.psm1 => MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.psm1} (100%) rename DSCResources/{MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica/MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica.schema.mof => MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.schema.mof} (96%) diff --git a/DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroup/MSFT_xSQLServerAlwaysOnAvailabilityGroup.psm1 b/DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.psm1 similarity index 100% rename from DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroup/MSFT_xSQLServerAlwaysOnAvailabilityGroup.psm1 rename to DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.psm1 diff --git a/DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroup/MSFT_xSQLServerAlwaysOnAvailabilityGroup.schema.mof b/DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.schema.mof similarity index 96% rename from DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroup/MSFT_xSQLServerAlwaysOnAvailabilityGroup.schema.mof rename to DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.schema.mof index 7cf156426..521516263 100644 --- a/DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroup/MSFT_xSQLServerAlwaysOnAvailabilityGroup.schema.mof +++ b/DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerAlwaysOnAvailabilityGroup")] -class MSFT_xSQLServerAlwaysOnAvailabilityGroup : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerAOAG")] +class MSFT_xSQLServerAOAG : OMI_BaseResource { [Key, Description("The name of the availability group.")] String Name; [Required, Description("Hostname of the SQL Server to be configured.")] String SQLServer; diff --git a/DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.psm1 b/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.psm1 rename to DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.psm1 index 5e4cc5283..b86c1a5aa 100644 --- a/DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.psm1 +++ b/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.psm1 @@ -5,7 +5,7 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Pare Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` -ChildPath 'CommonResourceHelper.psm1') -$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership' +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_xSQLServerAOAGDatabaseMembership' <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.schema.mof b/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.schema.mof similarity index 92% rename from DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.schema.mof rename to DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.schema.mof index 0df29e907..81ff59ecc 100644 --- a/DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.schema.mof +++ b/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership")] -class MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerAOAGDatabaseMembership")] +class MSFT_xSQLServerAOAGDatabaseMembership : OMI_BaseResource { [Required, Description("The name of the database(s) to add to the availability group. This accepts wildcards.")] String DatabaseName[]; [Key, Description("Hostname of the SQL Server where the primary replica of the availability group lives. If the availability group is not currently on this server, the resource will attempt to connect to the server where the primary replica lives.")] String SQLServer; diff --git a/DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/en-US/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.strings.psd1 b/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/MSFT_xSQLServerAOAGDatabaseMembership.strings.psd1 similarity index 92% rename from DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/en-US/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.strings.psd1 rename to DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/MSFT_xSQLServerAOAGDatabaseMembership.strings.psd1 index 4a29519a9..e6f7ca437 100644 --- a/DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/en-US/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.strings.psd1 +++ b/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/MSFT_xSQLServerAOAGDatabaseMembership.strings.psd1 @@ -1,4 +1,4 @@ -# Localized resources for xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership +# Localized resources for xSQLServerAOAGDatabaseMembership ConvertFrom-StringData @' AddingDatabasesToAvailabilityGroup = Adding the following databases to the '{0}' availability group: {1}. diff --git a/DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/en-US/about_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.help.txt b/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/about_xSQLServerAOAGDatabaseMembership.help.txt similarity index 100% rename from DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/en-US/about_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.help.txt rename to DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/about_xSQLServerAOAGDatabaseMembership.help.txt diff --git a/DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica/MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica.psm1 b/DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.psm1 similarity index 100% rename from DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica/MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica.psm1 rename to DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.psm1 diff --git a/DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica/MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica.schema.mof b/DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.schema.mof similarity index 96% rename from DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica/MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica.schema.mof rename to DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.schema.mof index d6aba9b0b..6b9a4d5b0 100644 --- a/DSCResources/MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica/MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica.schema.mof +++ b/DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerAlwaysOnAvailabilityGroupReplica")] -class MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerAOAGReplica")] +class MSFT_xSQLServerAOAGReplica : OMI_BaseResource { [Key, Description("The name of the availability group replica. For named instances this must be in the following format SQLServer\\InstanceName.")] String Name; [Key, Description("The name of the availability group.")] String AvailabilityGroupName; From 97fca69b0a2ca62f4538f9e5c9fcad4ab440c776 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 2 Nov 2017 12:26:09 -0500 Subject: [PATCH 02/42] Reduce file path across resources --- xSQLServer.zip | Bin 0 -> 404541 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 xSQLServer.zip diff --git a/xSQLServer.zip b/xSQLServer.zip new file mode 100644 index 0000000000000000000000000000000000000000..7b08f7ccc03ced0f0c61977f0675e3aa800d4723 GIT binary patch literal 404541 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 z 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%0D#$1008Fy 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 i$=~Uuwe9Z;-!^r_lY6}t$|y-c Date: Thu, 2 Nov 2017 19:15:02 -0500 Subject: [PATCH 04/42] cleanup missed renaming --- DSCResources/CommonResourceHelper.psm1 | 2 +- .../{MSFT_xSqlAG.schema.mof => MSFT_SqlAG.schema.mof} | 0 DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 | 2 +- .../en-US/MSFT_SqlAGDatabases.strings.psd1 | 2 +- DSCResources/MSFT_SqlAlias/MSFT_SqlAlias.schema.mof | 4 ++-- SqlServerDSCHelper.psm1 | 2 +- en-US/SqlServerDSCHelper.strings.psd1 | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) rename DSCResources/MSFT_SqlAG/{MSFT_xSqlAG.schema.mof => MSFT_SqlAG.schema.mof} (100%) diff --git a/DSCResources/CommonResourceHelper.psm1 b/DSCResources/CommonResourceHelper.psm1 index 33c387a67..f130a804b 100644 --- a/DSCResources/CommonResourceHelper.psm1 +++ b/DSCResources/CommonResourceHelper.psm1 @@ -204,7 +204,7 @@ function New-InvalidResultException For WindowsOptionalFeature: MSFT_WindowsOptionalFeature For Service: MSFT_ServiceResource For Registry: MSFT_RegistryResource - For Helper: SqlServerHelper + For Helper: SqlServerDSCHelper .PARAMETER ScriptRoot Optional. The root path where to expect to find the culture folder. This is only needed diff --git a/DSCResources/MSFT_SqlAG/MSFT_xSqlAG.schema.mof b/DSCResources/MSFT_SqlAG/MSFT_SqlAG.schema.mof similarity index 100% rename from DSCResources/MSFT_SqlAG/MSFT_xSqlAG.schema.mof rename to DSCResources/MSFT_SqlAG/MSFT_SqlAG.schema.mof diff --git a/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 b/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 index 87e68014a..45b733e96 100644 --- a/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 +++ b/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 @@ -5,7 +5,7 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Pare Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` -ChildPath 'CommonResourceHelper.psm1') -$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlServerAGDatabaseMembership' +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlAGDatabases' <# .SYNOPSIS diff --git a/DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 b/DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 index 874289645..c8fd93ed7 100644 --- a/DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 +++ b/DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 @@ -1,4 +1,4 @@ -# Localized resources for SqlServerAGDatabaseMembership +# Localized resources for SqlAGDatabases ConvertFrom-StringData @' AddingDatabasesToAvailabilityGroup = Adding the following databases to the '{0}' availability group: {1}. diff --git a/DSCResources/MSFT_SqlAlias/MSFT_SqlAlias.schema.mof b/DSCResources/MSFT_SqlAlias/MSFT_SqlAlias.schema.mof index d410ae257..2878dc822 100644 --- a/DSCResources/MSFT_SqlAlias/MSFT_SqlAlias.schema.mof +++ b/DSCResources/MSFT_SqlAlias/MSFT_SqlAlias.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("SQLAlias")] -class MSFT_SQLAlias : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlAlias")] +class MSFT_SqlAlias : OMI_BaseResource { [Key, Description("The name of Alias (e.g. svr01\\inst01).")] String Name; [Write, Description("Protocol to use when connecting. Valid values are 'TCP' or 'NP' (Named Pipes). Default value is 'TCP'."), ValueMap{"TCP","NP"}, Values{"TCP","NP"}] String Protocol; diff --git a/SqlServerDSCHelper.psm1 b/SqlServerDSCHelper.psm1 index 26ca553ec..819166cf4 100644 --- a/SqlServerDSCHelper.psm1 +++ b/SqlServerDSCHelper.psm1 @@ -3,7 +3,7 @@ Import-Module -Name (Join-Path -Path (Join-Path -Path $PSScriptRoot ` -ChildPath 'DscResources') ` -ChildPath 'CommonResourceHelper.psm1') -$script:localizedData = Get-LocalizedData -ResourceName 'SqlServerHelper' -ScriptRoot $PSScriptRoot +$script:localizedData = Get-LocalizedData -ResourceName 'SqlServerDSCHelper' -ScriptRoot $PSScriptRoot <# .SYNOPSIS diff --git a/en-US/SqlServerDSCHelper.strings.psd1 b/en-US/SqlServerDSCHelper.strings.psd1 index 6c8f3bd6b..08fed202c 100644 --- a/en-US/SqlServerDSCHelper.strings.psd1 +++ b/en-US/SqlServerDSCHelper.strings.psd1 @@ -1,4 +1,4 @@ -# Localized resources for helper module SqlServerHelper. +# Localized resources for helper module SqlServerDSCHelper. ConvertFrom-StringData @' ConnectedToDatabaseEngineInstance = Connected to SQL instance '{0}'. From 1fa173b679c7c289a9a9934ea543d23ebbaf457a Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Tue, 7 Nov 2017 17:36:17 -0600 Subject: [PATCH 05/42] Pascal case --- .../Integration/MSFT_SqlAlwaysOnService.Integration.Tests.ps1 | 2 +- .../MSFT_SqlDatabaseDefaultLocation.Integration.Tests.ps1 | 2 +- Tests/Integration/MSFT_SqlRS.Integration.Tests.ps1 | 2 +- Tests/Integration/MSFT_SqlSetup.Integration.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlAGListener.Tests.ps1 | 4 ++-- Tests/Unit/MSFT_SqlAlias.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlAlwaysOnService.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlDatabase.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlDatabaseOwner.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlRS.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlScript.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerEndpoint.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerEndpointPermission.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerEndpointState.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerLogin.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerMaxDop.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerMemory.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerNetwork.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerPermission.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerRole.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlSetup.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlWindowsFirewall.Tests.ps1 | 2 +- 25 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Tests/Integration/MSFT_SqlAlwaysOnService.Integration.Tests.ps1 b/Tests/Integration/MSFT_SqlAlwaysOnService.Integration.Tests.ps1 index 2fb4cacfb..68b8267ec 100644 --- a/Tests/Integration/MSFT_SqlAlwaysOnService.Integration.Tests.ps1 +++ b/Tests/Integration/MSFT_SqlAlwaysOnService.Integration.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceFriendlyName = 'SqlAlwaysOnService' $script:DSCResourceName = "MSFT_$($script:DSCResourceFriendlyName)" diff --git a/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.Integration.Tests.ps1 b/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.Integration.Tests.ps1 index d1cb37597..b6d06f7da 100644 --- a/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.Integration.Tests.ps1 +++ b/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.Integration.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceFriendlyName = 'SqlDatabaseDefaultLocation' $script:DSCResourceName = "MSFT_$($script:DSCResourceFriendlyName)" diff --git a/Tests/Integration/MSFT_SqlRS.Integration.Tests.ps1 b/Tests/Integration/MSFT_SqlRS.Integration.Tests.ps1 index 4be013982..fd3f73b18 100644 --- a/Tests/Integration/MSFT_SqlRS.Integration.Tests.ps1 +++ b/Tests/Integration/MSFT_SqlRS.Integration.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceFriendlyName = 'SqlRS' $script:DSCResourceName = "MSFT_$($script:DSCResourceFriendlyName)" diff --git a/Tests/Integration/MSFT_SqlSetup.Integration.Tests.ps1 b/Tests/Integration/MSFT_SqlSetup.Integration.Tests.ps1 index 9855151bb..83f270fd1 100644 --- a/Tests/Integration/MSFT_SqlSetup.Integration.Tests.ps1 +++ b/Tests/Integration/MSFT_SqlSetup.Integration.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceFriendlyName = 'SqlSetup' $script:DSCResourceName = "MSFT_$($script:DSCResourceFriendlyName)" diff --git a/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 b/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 index 83f0a2ed2..a1fe4d5de 100644 --- a/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'SQLServerDSC' -$script:DSCResourceName = 'MSFT_SqlServerDSCAvailabilityGroupListener' +$script:DSCModuleName = 'SQLServerDsc' +$script:DSCResourceName = 'MSFT_SqlAGListener' #region HEADER diff --git a/Tests/Unit/MSFT_SqlAlias.Tests.ps1 b/Tests/Unit/MSFT_SqlAlias.Tests.ps1 index eb79a65c1..808849c1c 100644 --- a/Tests/Unit/MSFT_SqlAlias.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAlias.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlAlias' #region HEADER diff --git a/Tests/Unit/MSFT_SqlAlwaysOnService.Tests.ps1 b/Tests/Unit/MSFT_SqlAlwaysOnService.Tests.ps1 index a4b7afab0..67915de20 100644 --- a/Tests/Unit/MSFT_SqlAlwaysOnService.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAlwaysOnService.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlAlwaysOnService' # Unit Test Template Version: 1.1.0 diff --git a/Tests/Unit/MSFT_SqlDatabase.Tests.ps1 b/Tests/Unit/MSFT_SqlDatabase.Tests.ps1 index 7469fc30d..4c8a7946c 100644 --- a/Tests/Unit/MSFT_SqlDatabase.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlDatabase.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlDatabase' #region HEADER diff --git a/Tests/Unit/MSFT_SqlDatabaseOwner.Tests.ps1 b/Tests/Unit/MSFT_SqlDatabaseOwner.Tests.ps1 index 96295181c..16f70dbd8 100644 --- a/Tests/Unit/MSFT_SqlDatabaseOwner.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlDatabaseOwner.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlDatabaseOwner' #region HEADER diff --git a/Tests/Unit/MSFT_SqlRS.Tests.ps1 b/Tests/Unit/MSFT_SqlRS.Tests.ps1 index a6e7a8fab..52f743273 100644 --- a/Tests/Unit/MSFT_SqlRS.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlRS.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlRS' #region HEADER diff --git a/Tests/Unit/MSFT_SqlScript.Tests.ps1 b/Tests/Unit/MSFT_SqlScript.Tests.ps1 index 2bcc921c7..e7e6d54b6 100644 --- a/Tests/Unit/MSFT_SqlScript.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlScript.Tests.ps1 @@ -42,7 +42,7 @@ try Invoke-TestSetup InModuleScope 'MSFT_SqlScript' { - $script:DSCModuleName = 'SQLServerDSC' + $script:DSCModuleName = 'SQLServerDsc' $resourceName = 'MSFT_SqlScript' $testParameters = @{ diff --git a/Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 b/Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 index 12aae9ee4..0b70e7ddd 100644 --- a/Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlServerDSCConfiguration' # Unit Test Template Version: 1.1.0 diff --git a/Tests/Unit/MSFT_SqlServerEndpoint.Tests.ps1 b/Tests/Unit/MSFT_SqlServerEndpoint.Tests.ps1 index 4b27c5899..698c41e38 100644 --- a/Tests/Unit/MSFT_SqlServerEndpoint.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerEndpoint.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlServerEndpoint' #region HEADER diff --git a/Tests/Unit/MSFT_SqlServerEndpointPermission.Tests.ps1 b/Tests/Unit/MSFT_SqlServerEndpointPermission.Tests.ps1 index f33833ac0..f7ffd5dc3 100644 --- a/Tests/Unit/MSFT_SqlServerEndpointPermission.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerEndpointPermission.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlServerEndpointPermission' #region HEADER diff --git a/Tests/Unit/MSFT_SqlServerEndpointState.Tests.ps1 b/Tests/Unit/MSFT_SqlServerEndpointState.Tests.ps1 index a28fae2b0..beabc9a45 100644 --- a/Tests/Unit/MSFT_SqlServerEndpointState.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerEndpointState.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlServerEndpointState' #region HEADER diff --git a/Tests/Unit/MSFT_SqlServerLogin.Tests.ps1 b/Tests/Unit/MSFT_SqlServerLogin.Tests.ps1 index f530fd467..90594daa6 100644 --- a/Tests/Unit/MSFT_SqlServerLogin.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerLogin.Tests.ps1 @@ -2,7 +2,7 @@ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingConvertToSecureStringWithPlainText', '')] param() -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlServerLogin' #region HEADER diff --git a/Tests/Unit/MSFT_SqlServerMaxDop.Tests.ps1 b/Tests/Unit/MSFT_SqlServerMaxDop.Tests.ps1 index 6eff03832..bb4bfaea7 100644 --- a/Tests/Unit/MSFT_SqlServerMaxDop.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerMaxDop.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlServerMaxDop' #region HEADER diff --git a/Tests/Unit/MSFT_SqlServerMemory.Tests.ps1 b/Tests/Unit/MSFT_SqlServerMemory.Tests.ps1 index f3c23cb8e..2e4921d73 100644 --- a/Tests/Unit/MSFT_SqlServerMemory.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerMemory.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlServerMemory' #region HEADER diff --git a/Tests/Unit/MSFT_SqlServerNetwork.Tests.ps1 b/Tests/Unit/MSFT_SqlServerNetwork.Tests.ps1 index 21c5ecc53..b578aa894 100644 --- a/Tests/Unit/MSFT_SqlServerNetwork.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerNetwork.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlServerNetwork' #region HEADER diff --git a/Tests/Unit/MSFT_SqlServerPermission.Tests.ps1 b/Tests/Unit/MSFT_SqlServerPermission.Tests.ps1 index 5e40ca358..fafdf35a1 100644 --- a/Tests/Unit/MSFT_SqlServerPermission.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerPermission.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlServerPermission' #region HEADER diff --git a/Tests/Unit/MSFT_SqlServerRole.Tests.ps1 b/Tests/Unit/MSFT_SqlServerRole.Tests.ps1 index 4f8dcf679..4a2fb81dd 100644 --- a/Tests/Unit/MSFT_SqlServerRole.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerRole.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlServerRole' #region HEADER diff --git a/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 b/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 index 164d0c49e..d441dbae5 100644 --- a/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlServerServiceAccount' #region HEADER diff --git a/Tests/Unit/MSFT_SqlSetup.Tests.ps1 b/Tests/Unit/MSFT_SqlSetup.Tests.ps1 index 32cc280c8..8a205c784 100644 --- a/Tests/Unit/MSFT_SqlSetup.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlSetup.Tests.ps1 @@ -2,7 +2,7 @@ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingConvertToSecureStringWithPlainText', '')] param() -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlSetup' #region HEADER diff --git a/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 b/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 index afbaf5be3..95768a365 100644 --- a/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlWaitForAvailabilityGroup' #region HEADER diff --git a/Tests/Unit/MSFT_SqlWindowsFirewall.Tests.ps1 b/Tests/Unit/MSFT_SqlWindowsFirewall.Tests.ps1 index fc5d495a0..2de69b43a 100644 --- a/Tests/Unit/MSFT_SqlWindowsFirewall.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlWindowsFirewall.Tests.ps1 @@ -2,7 +2,7 @@ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingConvertToSecureStringWithPlainText', '')] param() -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlWindowsFirewall' #region HEADER From 521335be92f8cc192381ce3ef71d477509dbcb41 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Tue, 7 Nov 2017 17:45:55 -0600 Subject: [PATCH 06/42] Incorrect module reference; fixing Pascal case in "SQL" --- ...t.strings.psd1 => MSFT_SqlServerServiceAccount.strings.psd1} | 0 Examples/Resources/SqlAG/1-CreateAvailabilityGroup.ps1 | 2 +- Examples/Resources/SqlAG/2-RemoveAvailabilityGroup.ps1 | 2 +- Examples/Resources/SqlAG/3-CreateAvailabilityGroupDetailed.ps1 | 2 +- .../SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 | 2 +- .../SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 | 2 +- .../3-MatchDefinedDatabasesInAvailabilityGroup.ps1 | 2 +- .../1-AddAvailabilityGroupListenerWithSameNameAsVCO.ps1 | 2 +- .../2-AddAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 | 2 +- .../3-RemoveAvailabilityGroupListenerWithSameNameAsVCO.ps1 | 2 +- .../4-RemoveAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 | 2 +- ...vailabilityGroupListenerUsingDHCPWithDefaultServerSubnet.ps1 | 2 +- ...-AddAvailabilityGroupListenerUsingDHCPWithSpecificSubnet.ps1 | 2 +- .../Resources/SqlAGReplica/1-CreateAvailabilityGroupReplica.ps1 | 2 +- .../Resources/SqlAGReplica/2-RemoveAvailabilityGroupReplica.ps1 | 2 +- Examples/Resources/SqlAlwaysOnService/1-EnableAlwaysOn.ps1 | 2 +- Examples/Resources/SqlAlwaysOnService/2-DisableAlwaysOn.ps1 | 2 +- Examples/Resources/SqlDatabase/1-CreateDatabase.ps1 | 2 +- Examples/Resources/SqlDatabase/2-DeleteDatabase.ps1 | 2 +- .../SqlDatabaseDefaultLocation/1-SetDatabaseDefaultLocation.ps1 | 2 +- Examples/Resources/SqlDatabaseOwner/1-SetDatabaseOwner.ps1 | 2 +- .../SqlDatabasePermission/1-GrantDatabasePermissions.ps1 | 2 +- .../SqlDatabasePermission/2-RevokeDatabasePermissions.ps1 | 2 +- .../SqlDatabasePermission/3-DenyDatabasePermissions.ps1 | 2 +- .../SqlDatabaseRecoveryModel/1-SetDatabaseRecoveryModel.ps1 | 2 +- Examples/Resources/SqlDatabaseRole/1-AddDatabaseRole.ps1 | 2 +- Examples/Resources/SqlDatabaseRole/2-RemoveDatabaseRole.ps1 | 2 +- Examples/Resources/SqlRS/1-DefaultConfiguration.ps1 | 2 +- Examples/Resources/SqlRS/2-CustomConfiguration.ps1 | 2 +- .../1-ConfigureTwoInstancesOnTheSameServerToEnableClr.ps1 | 2 +- .../2-ConfigureInstanceToEnablePriorityBoost.ps1 | 2 +- Examples/Resources/SqlServerLogin/1-AddLogin.ps1 | 2 +- Examples/Resources/SqlServerLogin/2-RemoveLogin.ps1 | 2 +- Examples/Resources/SqlServerMaxDop/1-SetMaxDopToOne.ps1 | 2 +- Examples/Resources/SqlServerMaxDop/2-SetMaxDopToAuto.ps1 | 2 +- Examples/Resources/SqlServerMaxDop/3-SetMaxDopToDefault.ps1 | 2 +- Examples/Resources/SqlServerMemory/1-SetMaxMemoryTo12GB.ps1 | 2 +- Examples/Resources/SqlServerMemory/2-SetMaxMemoryToAuto.ps1 | 2 +- .../3-SetMinMemoryToFixedValueAndMaxMemoryToAuto.ps1 | 2 +- Examples/Resources/SqlServerMemory/4-SetMaxMemoryToDefault.ps1 | 2 +- .../Resources/SqlServerNetwork/1-EnableTcpIpWithStaticPort.ps1 | 2 +- .../Resources/SqlServerNetwork/2-EnableTcpIpWithDynamicPort.ps1 | 2 +- .../SqlServerReplication/1-ConfigureInstanceAsDistributor.ps1 | 2 +- .../SqlServerReplication/2-ConfigureInstanceAsPublisher.ps1 | 2 +- Examples/Resources/SqlServerRole/1-AddServerRole.ps1 | 2 +- Examples/Resources/SqlServerRole/2-RemoveServerRole.ps1 | 2 +- Examples/Resources/SqlServerRole/3-AddMembersToServerRole.ps1 | 2 +- .../Resources/SqlServerRole/4-MembersToIncludeInServerRole.ps1 | 2 +- .../Resources/SqlServerRole/5-MembersToExcludeInServerRole.ps1 | 2 +- .../1-ConfigureServiceAccount-UserAccount.ps1 | 2 +- .../2-ConfigureServiceAccount-VirtualAccount.ps1 | 2 +- .../SqlWindowsFirewall/1-CreateInboundFirewallRules.ps1 | 2 +- .../SqlWindowsFirewall/2-RemoveInboundFirewallRules.ps1 | 2 +- Tests/Integration/MSFT_SqlAlwaysOnService.Integration.Tests.ps1 | 2 +- .../MSFT_SqlDatabaseDefaultLocation.Integration.Tests.ps1 | 2 +- Tests/Integration/MSFT_SqlRS.Integration.Tests.ps1 | 2 +- Tests/Integration/MSFT_SqlSetup.Integration.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlAGListener.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlAlias.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlAlwaysOnService.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlDatabase.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlDatabaseOwner.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlRS.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlScript.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerEndpoint.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerEndpointPermission.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerEndpointState.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerLogin.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerMaxDop.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerMemory.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerNetwork.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerPermission.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerRole.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlSetup.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlWindowsFirewall.Tests.ps1 | 2 +- 78 files changed, 77 insertions(+), 77 deletions(-) rename DSCResources/MSFT_SqlServerServiceAccount/en-US/{MSFT_xSQLServerServiceAccount.strings.psd1 => MSFT_SqlServerServiceAccount.strings.psd1} (100%) diff --git a/DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_xSQLServerServiceAccount.strings.psd1 b/DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_SqlServerServiceAccount.strings.psd1 similarity index 100% rename from DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_xSQLServerServiceAccount.strings.psd1 rename to DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_SqlServerServiceAccount.strings.psd1 diff --git a/Examples/Resources/SqlAG/1-CreateAvailabilityGroup.ps1 b/Examples/Resources/SqlAG/1-CreateAvailabilityGroup.ps1 index 9fbc8a575..7565b18aa 100644 --- a/Examples/Resources/SqlAG/1-CreateAvailabilityGroup.ps1 +++ b/Examples/Resources/SqlAG/1-CreateAvailabilityGroup.ps1 @@ -25,7 +25,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc Node $AllNodes.NodeName { # Adding the required service account to allow the cluster to log into SQL diff --git a/Examples/Resources/SqlAG/2-RemoveAvailabilityGroup.ps1 b/Examples/Resources/SqlAG/2-RemoveAvailabilityGroup.ps1 index e989796dc..8637df955 100644 --- a/Examples/Resources/SqlAG/2-RemoveAvailabilityGroup.ps1 +++ b/Examples/Resources/SqlAG/2-RemoveAvailabilityGroup.ps1 @@ -25,7 +25,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc Node $AllNodes.NodeName { if ( $Node.Role -eq 'PrimaryReplica' ) diff --git a/Examples/Resources/SqlAG/3-CreateAvailabilityGroupDetailed.ps1 b/Examples/Resources/SqlAG/3-CreateAvailabilityGroupDetailed.ps1 index 10f1662f6..01f7c504e 100644 --- a/Examples/Resources/SqlAG/3-CreateAvailabilityGroupDetailed.ps1 +++ b/Examples/Resources/SqlAG/3-CreateAvailabilityGroupDetailed.ps1 @@ -43,7 +43,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc Node $AllNodes.NodeName { # Adding the required service account to allow the cluster to log into SQL diff --git a/Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 b/Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 index bb78cae9c..683d631fd 100644 --- a/Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 +++ b/Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 @@ -36,7 +36,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc Node $AllNodes.NodeName { # Adding the required service account to allow the cluster to log into SQL diff --git a/Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 b/Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 index e95c8fd6b..aebf3956e 100644 --- a/Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 +++ b/Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 @@ -31,7 +31,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc Node $AllNodes.NodeName { # Adding the required service account to allow the cluster to log into SQL diff --git a/Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 b/Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 index 2f2193fb1..794b25fd2 100644 --- a/Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 +++ b/Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 @@ -31,7 +31,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc Node $AllNodes.NodeName { # Adding the required service account to allow the cluster to log into SQL diff --git a/Examples/Resources/SqlAGListener/1-AddAvailabilityGroupListenerWithSameNameAsVCO.ps1 b/Examples/Resources/SqlAGListener/1-AddAvailabilityGroupListenerWithSameNameAsVCO.ps1 index b3a45dd5b..5c255b90c 100644 --- a/Examples/Resources/SqlAGListener/1-AddAvailabilityGroupListenerWithSameNameAsVCO.ps1 +++ b/Examples/Resources/SqlAGListener/1-AddAvailabilityGroupListenerWithSameNameAsVCO.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlAGListener/2-AddAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 b/Examples/Resources/SqlAGListener/2-AddAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 index db9900aa9..9b07a7932 100644 --- a/Examples/Resources/SqlAGListener/2-AddAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 +++ b/Examples/Resources/SqlAGListener/2-AddAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlAGListener/3-RemoveAvailabilityGroupListenerWithSameNameAsVCO.ps1 b/Examples/Resources/SqlAGListener/3-RemoveAvailabilityGroupListenerWithSameNameAsVCO.ps1 index eb37722fd..fa7552124 100644 --- a/Examples/Resources/SqlAGListener/3-RemoveAvailabilityGroupListenerWithSameNameAsVCO.ps1 +++ b/Examples/Resources/SqlAGListener/3-RemoveAvailabilityGroupListenerWithSameNameAsVCO.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlAGListener/4-RemoveAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 b/Examples/Resources/SqlAGListener/4-RemoveAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 index 2042fc973..8003f7832 100644 --- a/Examples/Resources/SqlAGListener/4-RemoveAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 +++ b/Examples/Resources/SqlAGListener/4-RemoveAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlAGListener/5-AddAvailabilityGroupListenerUsingDHCPWithDefaultServerSubnet.ps1 b/Examples/Resources/SqlAGListener/5-AddAvailabilityGroupListenerUsingDHCPWithDefaultServerSubnet.ps1 index b6209e1ca..e8eb0365b 100644 --- a/Examples/Resources/SqlAGListener/5-AddAvailabilityGroupListenerUsingDHCPWithDefaultServerSubnet.ps1 +++ b/Examples/Resources/SqlAGListener/5-AddAvailabilityGroupListenerUsingDHCPWithDefaultServerSubnet.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlAGListener/6-AddAvailabilityGroupListenerUsingDHCPWithSpecificSubnet.ps1 b/Examples/Resources/SqlAGListener/6-AddAvailabilityGroupListenerUsingDHCPWithSpecificSubnet.ps1 index f0de3d2b6..ab5cffd9c 100644 --- a/Examples/Resources/SqlAGListener/6-AddAvailabilityGroupListenerUsingDHCPWithSpecificSubnet.ps1 +++ b/Examples/Resources/SqlAGListener/6-AddAvailabilityGroupListenerUsingDHCPWithSpecificSubnet.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlAGReplica/1-CreateAvailabilityGroupReplica.ps1 b/Examples/Resources/SqlAGReplica/1-CreateAvailabilityGroupReplica.ps1 index 72025c1ca..e56bf0fdb 100644 --- a/Examples/Resources/SqlAGReplica/1-CreateAvailabilityGroupReplica.ps1 +++ b/Examples/Resources/SqlAGReplica/1-CreateAvailabilityGroupReplica.ps1 @@ -38,7 +38,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc Node $AllNodes.NodeName { # Adding the required service account to allow the cluster to log into SQL diff --git a/Examples/Resources/SqlAGReplica/2-RemoveAvailabilityGroupReplica.ps1 b/Examples/Resources/SqlAGReplica/2-RemoveAvailabilityGroupReplica.ps1 index d3c09dfc3..463de22b9 100644 --- a/Examples/Resources/SqlAGReplica/2-RemoveAvailabilityGroupReplica.ps1 +++ b/Examples/Resources/SqlAGReplica/2-RemoveAvailabilityGroupReplica.ps1 @@ -31,7 +31,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc Node $AllNodes.NodeName { # Adding the required service account to allow the cluster to log into SQL diff --git a/Examples/Resources/SqlAlwaysOnService/1-EnableAlwaysOn.ps1 b/Examples/Resources/SqlAlwaysOnService/1-EnableAlwaysOn.ps1 index 6429c72d4..686cf61c7 100644 --- a/Examples/Resources/SqlAlwaysOnService/1-EnableAlwaysOn.ps1 +++ b/Examples/Resources/SqlAlwaysOnService/1-EnableAlwaysOn.ps1 @@ -13,7 +13,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlAlwaysOnService/2-DisableAlwaysOn.ps1 b/Examples/Resources/SqlAlwaysOnService/2-DisableAlwaysOn.ps1 index 86189a9a3..a9b7cbbb2 100644 --- a/Examples/Resources/SqlAlwaysOnService/2-DisableAlwaysOn.ps1 +++ b/Examples/Resources/SqlAlwaysOnService/2-DisableAlwaysOn.ps1 @@ -13,7 +13,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlDatabase/1-CreateDatabase.ps1 b/Examples/Resources/SqlDatabase/1-CreateDatabase.ps1 index 32d08d391..419cb6a61 100644 --- a/Examples/Resources/SqlDatabase/1-CreateDatabase.ps1 +++ b/Examples/Resources/SqlDatabase/1-CreateDatabase.ps1 @@ -16,7 +16,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlDatabase/2-DeleteDatabase.ps1 b/Examples/Resources/SqlDatabase/2-DeleteDatabase.ps1 index 31b3c4269..2d115d4f0 100644 --- a/Examples/Resources/SqlDatabase/2-DeleteDatabase.ps1 +++ b/Examples/Resources/SqlDatabase/2-DeleteDatabase.ps1 @@ -13,7 +13,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlDatabaseDefaultLocation/1-SetDatabaseDefaultLocation.ps1 b/Examples/Resources/SqlDatabaseDefaultLocation/1-SetDatabaseDefaultLocation.ps1 index 80840d8a4..af3dfd695 100644 --- a/Examples/Resources/SqlDatabaseDefaultLocation/1-SetDatabaseDefaultLocation.ps1 +++ b/Examples/Resources/SqlDatabaseDefaultLocation/1-SetDatabaseDefaultLocation.ps1 @@ -16,7 +16,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlDatabaseOwner/1-SetDatabaseOwner.ps1 b/Examples/Resources/SqlDatabaseOwner/1-SetDatabaseOwner.ps1 index 7b62f77fd..6ad05fcfc 100644 --- a/Examples/Resources/SqlDatabaseOwner/1-SetDatabaseOwner.ps1 +++ b/Examples/Resources/SqlDatabaseOwner/1-SetDatabaseOwner.ps1 @@ -13,7 +13,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlDatabasePermission/1-GrantDatabasePermissions.ps1 b/Examples/Resources/SqlDatabasePermission/1-GrantDatabasePermissions.ps1 index 6061e75cd..7c59b5cee 100644 --- a/Examples/Resources/SqlDatabasePermission/1-GrantDatabasePermissions.ps1 +++ b/Examples/Resources/SqlDatabasePermission/1-GrantDatabasePermissions.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { SqlServerLogin Add_SqlServerLogin_SQLAdmin diff --git a/Examples/Resources/SqlDatabasePermission/2-RevokeDatabasePermissions.ps1 b/Examples/Resources/SqlDatabasePermission/2-RevokeDatabasePermissions.ps1 index 95cb82d3e..f3149b3ea 100644 --- a/Examples/Resources/SqlDatabasePermission/2-RevokeDatabasePermissions.ps1 +++ b/Examples/Resources/SqlDatabasePermission/2-RevokeDatabasePermissions.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { SqlDatabasePermission RevokeGrant_SqlDatabasePermissions_SQLAdmin diff --git a/Examples/Resources/SqlDatabasePermission/3-DenyDatabasePermissions.ps1 b/Examples/Resources/SqlDatabasePermission/3-DenyDatabasePermissions.ps1 index 8155669b0..8128ffde9 100644 --- a/Examples/Resources/SqlDatabasePermission/3-DenyDatabasePermissions.ps1 +++ b/Examples/Resources/SqlDatabasePermission/3-DenyDatabasePermissions.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { SqlServerLogin Add_SqlServerLogin_SQLAdmin diff --git a/Examples/Resources/SqlDatabaseRecoveryModel/1-SetDatabaseRecoveryModel.ps1 b/Examples/Resources/SqlDatabaseRecoveryModel/1-SetDatabaseRecoveryModel.ps1 index 9422df0fd..982e74617 100644 --- a/Examples/Resources/SqlDatabaseRecoveryModel/1-SetDatabaseRecoveryModel.ps1 +++ b/Examples/Resources/SqlDatabaseRecoveryModel/1-SetDatabaseRecoveryModel.ps1 @@ -14,7 +14,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlDatabaseRole/1-AddDatabaseRole.ps1 b/Examples/Resources/SqlDatabaseRole/1-AddDatabaseRole.ps1 index c5130da0d..31d6eea2a 100644 --- a/Examples/Resources/SqlDatabaseRole/1-AddDatabaseRole.ps1 +++ b/Examples/Resources/SqlDatabaseRole/1-AddDatabaseRole.ps1 @@ -13,7 +13,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlDatabaseRole/2-RemoveDatabaseRole.ps1 b/Examples/Resources/SqlDatabaseRole/2-RemoveDatabaseRole.ps1 index d80d4323b..0bcd510bd 100644 --- a/Examples/Resources/SqlDatabaseRole/2-RemoveDatabaseRole.ps1 +++ b/Examples/Resources/SqlDatabaseRole/2-RemoveDatabaseRole.ps1 @@ -13,7 +13,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlRS/1-DefaultConfiguration.ps1 b/Examples/Resources/SqlRS/1-DefaultConfiguration.ps1 index 4d45e8ca7..a14acec08 100644 --- a/Examples/Resources/SqlRS/1-DefaultConfiguration.ps1 +++ b/Examples/Resources/SqlRS/1-DefaultConfiguration.ps1 @@ -9,7 +9,7 @@ #> Configuration Example { - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { SqlRS DefaultConfiguration diff --git a/Examples/Resources/SqlRS/2-CustomConfiguration.ps1 b/Examples/Resources/SqlRS/2-CustomConfiguration.ps1 index f210f2c72..d1a872ff3 100644 --- a/Examples/Resources/SqlRS/2-CustomConfiguration.ps1 +++ b/Examples/Resources/SqlRS/2-CustomConfiguration.ps1 @@ -14,7 +14,7 @@ #> Configuration Example { - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { SqlRS DefaultConfiguration diff --git a/Examples/Resources/SqlServerConfiguration/1-ConfigureTwoInstancesOnTheSameServerToEnableClr.ps1 b/Examples/Resources/SqlServerConfiguration/1-ConfigureTwoInstancesOnTheSameServerToEnableClr.ps1 index b5d1223ba..5173fa11e 100644 --- a/Examples/Resources/SqlServerConfiguration/1-ConfigureTwoInstancesOnTheSameServerToEnableClr.ps1 +++ b/Examples/Resources/SqlServerConfiguration/1-ConfigureTwoInstancesOnTheSameServerToEnableClr.ps1 @@ -17,7 +17,7 @@ $configurationData = @{ Configuration Example { - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerConfiguration/2-ConfigureInstanceToEnablePriorityBoost.ps1 b/Examples/Resources/SqlServerConfiguration/2-ConfigureInstanceToEnablePriorityBoost.ps1 index b267350d6..9fa7337cf 100644 --- a/Examples/Resources/SqlServerConfiguration/2-ConfigureInstanceToEnablePriorityBoost.ps1 +++ b/Examples/Resources/SqlServerConfiguration/2-ConfigureInstanceToEnablePriorityBoost.ps1 @@ -7,7 +7,7 @@ Configuration Example { - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerLogin/1-AddLogin.ps1 b/Examples/Resources/SqlServerLogin/1-AddLogin.ps1 index d8ed1f97c..e44d1acfe 100644 --- a/Examples/Resources/SqlServerLogin/1-AddLogin.ps1 +++ b/Examples/Resources/SqlServerLogin/1-AddLogin.ps1 @@ -21,7 +21,7 @@ Configuration Example $LoginCredential ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { SqlServerLogin Add_WindowsUser diff --git a/Examples/Resources/SqlServerLogin/2-RemoveLogin.ps1 b/Examples/Resources/SqlServerLogin/2-RemoveLogin.ps1 index 4073db818..f09a9050f 100644 --- a/Examples/Resources/SqlServerLogin/2-RemoveLogin.ps1 +++ b/Examples/Resources/SqlServerLogin/2-RemoveLogin.ps1 @@ -11,7 +11,7 @@ This example shows how to remove the SQL Login 'SqlLogin'. Configuration Example { - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { SqlServerLogin Remove_WindowsUser diff --git a/Examples/Resources/SqlServerMaxDop/1-SetMaxDopToOne.ps1 b/Examples/Resources/SqlServerMaxDop/1-SetMaxDopToOne.ps1 index d772fec5d..4e513683c 100644 --- a/Examples/Resources/SqlServerMaxDop/1-SetMaxDopToOne.ps1 +++ b/Examples/Resources/SqlServerMaxDop/1-SetMaxDopToOne.ps1 @@ -13,7 +13,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerMaxDop/2-SetMaxDopToAuto.ps1 b/Examples/Resources/SqlServerMaxDop/2-SetMaxDopToAuto.ps1 index 4f1feddc2..bbdd8f4d3 100644 --- a/Examples/Resources/SqlServerMaxDop/2-SetMaxDopToAuto.ps1 +++ b/Examples/Resources/SqlServerMaxDop/2-SetMaxDopToAuto.ps1 @@ -18,7 +18,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerMaxDop/3-SetMaxDopToDefault.ps1 b/Examples/Resources/SqlServerMaxDop/3-SetMaxDopToDefault.ps1 index da1ce35fa..3b1a9459b 100644 --- a/Examples/Resources/SqlServerMaxDop/3-SetMaxDopToDefault.ps1 +++ b/Examples/Resources/SqlServerMaxDop/3-SetMaxDopToDefault.ps1 @@ -13,7 +13,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerMemory/1-SetMaxMemoryTo12GB.ps1 b/Examples/Resources/SqlServerMemory/1-SetMaxMemoryTo12GB.ps1 index 07413d429..30aa1f419 100644 --- a/Examples/Resources/SqlServerMemory/1-SetMaxMemoryTo12GB.ps1 +++ b/Examples/Resources/SqlServerMemory/1-SetMaxMemoryTo12GB.ps1 @@ -13,7 +13,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerMemory/2-SetMaxMemoryToAuto.ps1 b/Examples/Resources/SqlServerMemory/2-SetMaxMemoryToAuto.ps1 index 8d6369f08..4dcdb2d64 100644 --- a/Examples/Resources/SqlServerMemory/2-SetMaxMemoryToAuto.ps1 +++ b/Examples/Resources/SqlServerMemory/2-SetMaxMemoryToAuto.ps1 @@ -18,7 +18,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerMemory/3-SetMinMemoryToFixedValueAndMaxMemoryToAuto.ps1 b/Examples/Resources/SqlServerMemory/3-SetMinMemoryToFixedValueAndMaxMemoryToAuto.ps1 index 9ba0ceda5..0333515e5 100644 --- a/Examples/Resources/SqlServerMemory/3-SetMinMemoryToFixedValueAndMaxMemoryToAuto.ps1 +++ b/Examples/Resources/SqlServerMemory/3-SetMinMemoryToFixedValueAndMaxMemoryToAuto.ps1 @@ -13,7 +13,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerMemory/4-SetMaxMemoryToDefault.ps1 b/Examples/Resources/SqlServerMemory/4-SetMaxMemoryToDefault.ps1 index 239b7c9f6..c7d036493 100644 --- a/Examples/Resources/SqlServerMemory/4-SetMaxMemoryToDefault.ps1 +++ b/Examples/Resources/SqlServerMemory/4-SetMaxMemoryToDefault.ps1 @@ -13,7 +13,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerNetwork/1-EnableTcpIpWithStaticPort.ps1 b/Examples/Resources/SqlServerNetwork/1-EnableTcpIpWithStaticPort.ps1 index 64fb3bb9c..ee91453e0 100644 --- a/Examples/Resources/SqlServerNetwork/1-EnableTcpIpWithStaticPort.ps1 +++ b/Examples/Resources/SqlServerNetwork/1-EnableTcpIpWithStaticPort.ps1 @@ -13,7 +13,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerNetwork/2-EnableTcpIpWithDynamicPort.ps1 b/Examples/Resources/SqlServerNetwork/2-EnableTcpIpWithDynamicPort.ps1 index 0fa865d1b..ac0f5ddee 100644 --- a/Examples/Resources/SqlServerNetwork/2-EnableTcpIpWithDynamicPort.ps1 +++ b/Examples/Resources/SqlServerNetwork/2-EnableTcpIpWithDynamicPort.ps1 @@ -13,7 +13,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerReplication/1-ConfigureInstanceAsDistributor.ps1 b/Examples/Resources/SqlServerReplication/1-ConfigureInstanceAsDistributor.ps1 index 87b93c75f..25d71253b 100644 --- a/Examples/Resources/SqlServerReplication/1-ConfigureInstanceAsDistributor.ps1 +++ b/Examples/Resources/SqlServerReplication/1-ConfigureInstanceAsDistributor.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerReplication/2-ConfigureInstanceAsPublisher.ps1 b/Examples/Resources/SqlServerReplication/2-ConfigureInstanceAsPublisher.ps1 index 97efac64b..30737e9a8 100644 --- a/Examples/Resources/SqlServerReplication/2-ConfigureInstanceAsPublisher.ps1 +++ b/Examples/Resources/SqlServerReplication/2-ConfigureInstanceAsPublisher.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerRole/1-AddServerRole.ps1 b/Examples/Resources/SqlServerRole/1-AddServerRole.ps1 index 9cba88c1b..434fa4611 100644 --- a/Examples/Resources/SqlServerRole/1-AddServerRole.ps1 +++ b/Examples/Resources/SqlServerRole/1-AddServerRole.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { SqlServerRole Add_ServerRole_AdminSqlforBI diff --git a/Examples/Resources/SqlServerRole/2-RemoveServerRole.ps1 b/Examples/Resources/SqlServerRole/2-RemoveServerRole.ps1 index 359b6e928..6f54ea5de 100644 --- a/Examples/Resources/SqlServerRole/2-RemoveServerRole.ps1 +++ b/Examples/Resources/SqlServerRole/2-RemoveServerRole.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { SqlServerRole Remove_ServerRole diff --git a/Examples/Resources/SqlServerRole/3-AddMembersToServerRole.ps1 b/Examples/Resources/SqlServerRole/3-AddMembersToServerRole.ps1 index 39d654e33..6610afc01 100644 --- a/Examples/Resources/SqlServerRole/3-AddMembersToServerRole.ps1 +++ b/Examples/Resources/SqlServerRole/3-AddMembersToServerRole.ps1 @@ -13,7 +13,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { SqlServerRole Add_ServerRole_AdminSqlforBI diff --git a/Examples/Resources/SqlServerRole/4-MembersToIncludeInServerRole.ps1 b/Examples/Resources/SqlServerRole/4-MembersToIncludeInServerRole.ps1 index 827abea9a..ac85fed85 100644 --- a/Examples/Resources/SqlServerRole/4-MembersToIncludeInServerRole.ps1 +++ b/Examples/Resources/SqlServerRole/4-MembersToIncludeInServerRole.ps1 @@ -13,7 +13,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { SqlServerRole Add_ServerRole_AdminSqlforBI diff --git a/Examples/Resources/SqlServerRole/5-MembersToExcludeInServerRole.ps1 b/Examples/Resources/SqlServerRole/5-MembersToExcludeInServerRole.ps1 index 0bd9fbe63..cf742f88a 100644 --- a/Examples/Resources/SqlServerRole/5-MembersToExcludeInServerRole.ps1 +++ b/Examples/Resources/SqlServerRole/5-MembersToExcludeInServerRole.ps1 @@ -13,7 +13,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { SqlServerRole Drop_ServerRole_AdminSqlforBI diff --git a/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 b/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 index 6c0e81369..72273ff5a 100644 --- a/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 +++ b/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 @@ -12,7 +12,7 @@ Configuration Example $ServiceAccountCredential ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc Node localhost { SqlServerServiceAccount SetServiceAcccount_User diff --git a/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 b/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 index 4a9918c2d..21b7227f1 100644 --- a/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 +++ b/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 @@ -15,7 +15,7 @@ Configuration Example $ServiceAcccountCredential ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc Node localhost { SqlServerServiceAccount SetServiceAcccount_User diff --git a/Examples/Resources/SqlWindowsFirewall/1-CreateInboundFirewallRules.ps1 b/Examples/Resources/SqlWindowsFirewall/1-CreateInboundFirewallRules.ps1 index 3310e37e1..3333b28c2 100644 --- a/Examples/Resources/SqlWindowsFirewall/1-CreateInboundFirewallRules.ps1 +++ b/Examples/Resources/SqlWindowsFirewall/1-CreateInboundFirewallRules.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlWindowsFirewall/2-RemoveInboundFirewallRules.ps1 b/Examples/Resources/SqlWindowsFirewall/2-RemoveInboundFirewallRules.ps1 index c81f78e76..3ba7fac4c 100644 --- a/Examples/Resources/SqlWindowsFirewall/2-RemoveInboundFirewallRules.ps1 +++ b/Examples/Resources/SqlWindowsFirewall/2-RemoveInboundFirewallRules.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Tests/Integration/MSFT_SqlAlwaysOnService.Integration.Tests.ps1 b/Tests/Integration/MSFT_SqlAlwaysOnService.Integration.Tests.ps1 index 68b8267ec..09d3ed29b 100644 --- a/Tests/Integration/MSFT_SqlAlwaysOnService.Integration.Tests.ps1 +++ b/Tests/Integration/MSFT_SqlAlwaysOnService.Integration.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceFriendlyName = 'SqlAlwaysOnService' $script:DSCResourceName = "MSFT_$($script:DSCResourceFriendlyName)" diff --git a/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.Integration.Tests.ps1 b/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.Integration.Tests.ps1 index b6d06f7da..281c8ca91 100644 --- a/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.Integration.Tests.ps1 +++ b/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.Integration.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceFriendlyName = 'SqlDatabaseDefaultLocation' $script:DSCResourceName = "MSFT_$($script:DSCResourceFriendlyName)" diff --git a/Tests/Integration/MSFT_SqlRS.Integration.Tests.ps1 b/Tests/Integration/MSFT_SqlRS.Integration.Tests.ps1 index fd3f73b18..42250ea1f 100644 --- a/Tests/Integration/MSFT_SqlRS.Integration.Tests.ps1 +++ b/Tests/Integration/MSFT_SqlRS.Integration.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceFriendlyName = 'SqlRS' $script:DSCResourceName = "MSFT_$($script:DSCResourceFriendlyName)" diff --git a/Tests/Integration/MSFT_SqlSetup.Integration.Tests.ps1 b/Tests/Integration/MSFT_SqlSetup.Integration.Tests.ps1 index 83f270fd1..7a86c282d 100644 --- a/Tests/Integration/MSFT_SqlSetup.Integration.Tests.ps1 +++ b/Tests/Integration/MSFT_SqlSetup.Integration.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceFriendlyName = 'SqlSetup' $script:DSCResourceName = "MSFT_$($script:DSCResourceFriendlyName)" diff --git a/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 b/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 index a1fe4d5de..db2b6954d 100644 --- a/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlAGListener' #region HEADER diff --git a/Tests/Unit/MSFT_SqlAlias.Tests.ps1 b/Tests/Unit/MSFT_SqlAlias.Tests.ps1 index 808849c1c..8ff0a6fc8 100644 --- a/Tests/Unit/MSFT_SqlAlias.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAlias.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlAlias' #region HEADER diff --git a/Tests/Unit/MSFT_SqlAlwaysOnService.Tests.ps1 b/Tests/Unit/MSFT_SqlAlwaysOnService.Tests.ps1 index 67915de20..bec070953 100644 --- a/Tests/Unit/MSFT_SqlAlwaysOnService.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAlwaysOnService.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlAlwaysOnService' # Unit Test Template Version: 1.1.0 diff --git a/Tests/Unit/MSFT_SqlDatabase.Tests.ps1 b/Tests/Unit/MSFT_SqlDatabase.Tests.ps1 index 4c8a7946c..7818ccb22 100644 --- a/Tests/Unit/MSFT_SqlDatabase.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlDatabase.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlDatabase' #region HEADER diff --git a/Tests/Unit/MSFT_SqlDatabaseOwner.Tests.ps1 b/Tests/Unit/MSFT_SqlDatabaseOwner.Tests.ps1 index 16f70dbd8..6390c5d31 100644 --- a/Tests/Unit/MSFT_SqlDatabaseOwner.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlDatabaseOwner.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlDatabaseOwner' #region HEADER diff --git a/Tests/Unit/MSFT_SqlRS.Tests.ps1 b/Tests/Unit/MSFT_SqlRS.Tests.ps1 index 52f743273..28d1e6715 100644 --- a/Tests/Unit/MSFT_SqlRS.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlRS.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlRS' #region HEADER diff --git a/Tests/Unit/MSFT_SqlScript.Tests.ps1 b/Tests/Unit/MSFT_SqlScript.Tests.ps1 index e7e6d54b6..cb01b8bbc 100644 --- a/Tests/Unit/MSFT_SqlScript.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlScript.Tests.ps1 @@ -42,7 +42,7 @@ try Invoke-TestSetup InModuleScope 'MSFT_SqlScript' { - $script:DSCModuleName = 'SQLServerDsc' + $script:DSCModuleName = 'SqlServerDsc' $resourceName = 'MSFT_SqlScript' $testParameters = @{ diff --git a/Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 b/Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 index 0b70e7ddd..b47d8380c 100644 --- a/Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlServerDSCConfiguration' # Unit Test Template Version: 1.1.0 diff --git a/Tests/Unit/MSFT_SqlServerEndpoint.Tests.ps1 b/Tests/Unit/MSFT_SqlServerEndpoint.Tests.ps1 index 698c41e38..38979bb97 100644 --- a/Tests/Unit/MSFT_SqlServerEndpoint.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerEndpoint.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlServerEndpoint' #region HEADER diff --git a/Tests/Unit/MSFT_SqlServerEndpointPermission.Tests.ps1 b/Tests/Unit/MSFT_SqlServerEndpointPermission.Tests.ps1 index f7ffd5dc3..334e2fe9a 100644 --- a/Tests/Unit/MSFT_SqlServerEndpointPermission.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerEndpointPermission.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlServerEndpointPermission' #region HEADER diff --git a/Tests/Unit/MSFT_SqlServerEndpointState.Tests.ps1 b/Tests/Unit/MSFT_SqlServerEndpointState.Tests.ps1 index beabc9a45..becb6e759 100644 --- a/Tests/Unit/MSFT_SqlServerEndpointState.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerEndpointState.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlServerEndpointState' #region HEADER diff --git a/Tests/Unit/MSFT_SqlServerLogin.Tests.ps1 b/Tests/Unit/MSFT_SqlServerLogin.Tests.ps1 index 90594daa6..656333473 100644 --- a/Tests/Unit/MSFT_SqlServerLogin.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerLogin.Tests.ps1 @@ -2,7 +2,7 @@ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingConvertToSecureStringWithPlainText', '')] param() -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlServerLogin' #region HEADER diff --git a/Tests/Unit/MSFT_SqlServerMaxDop.Tests.ps1 b/Tests/Unit/MSFT_SqlServerMaxDop.Tests.ps1 index bb4bfaea7..45f72e5dd 100644 --- a/Tests/Unit/MSFT_SqlServerMaxDop.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerMaxDop.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlServerMaxDop' #region HEADER diff --git a/Tests/Unit/MSFT_SqlServerMemory.Tests.ps1 b/Tests/Unit/MSFT_SqlServerMemory.Tests.ps1 index 2e4921d73..e75a531d9 100644 --- a/Tests/Unit/MSFT_SqlServerMemory.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerMemory.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlServerMemory' #region HEADER diff --git a/Tests/Unit/MSFT_SqlServerNetwork.Tests.ps1 b/Tests/Unit/MSFT_SqlServerNetwork.Tests.ps1 index b578aa894..6a73a71b6 100644 --- a/Tests/Unit/MSFT_SqlServerNetwork.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerNetwork.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlServerNetwork' #region HEADER diff --git a/Tests/Unit/MSFT_SqlServerPermission.Tests.ps1 b/Tests/Unit/MSFT_SqlServerPermission.Tests.ps1 index fafdf35a1..92b966b03 100644 --- a/Tests/Unit/MSFT_SqlServerPermission.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerPermission.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlServerPermission' #region HEADER diff --git a/Tests/Unit/MSFT_SqlServerRole.Tests.ps1 b/Tests/Unit/MSFT_SqlServerRole.Tests.ps1 index 4a2fb81dd..e1436e1a2 100644 --- a/Tests/Unit/MSFT_SqlServerRole.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerRole.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlServerRole' #region HEADER diff --git a/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 b/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 index d441dbae5..7a3024225 100644 --- a/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlServerServiceAccount' #region HEADER diff --git a/Tests/Unit/MSFT_SqlSetup.Tests.ps1 b/Tests/Unit/MSFT_SqlSetup.Tests.ps1 index 8a205c784..a21083628 100644 --- a/Tests/Unit/MSFT_SqlSetup.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlSetup.Tests.ps1 @@ -2,7 +2,7 @@ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingConvertToSecureStringWithPlainText', '')] param() -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlSetup' #region HEADER diff --git a/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 b/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 index 95768a365..7b850a125 100644 --- a/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlWaitForAvailabilityGroup' #region HEADER diff --git a/Tests/Unit/MSFT_SqlWindowsFirewall.Tests.ps1 b/Tests/Unit/MSFT_SqlWindowsFirewall.Tests.ps1 index 2de69b43a..d92e485d8 100644 --- a/Tests/Unit/MSFT_SqlWindowsFirewall.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlWindowsFirewall.Tests.ps1 @@ -2,7 +2,7 @@ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingConvertToSecureStringWithPlainText', '')] param() -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlWindowsFirewall' #region HEADER From de185263e13fa1690b9f98e2c8fa310c7803a70c Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Tue, 7 Nov 2017 18:52:41 -0600 Subject: [PATCH 07/42] incorrect resource name in test --- Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 b/Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 index b47d8380c..416b75149 100644 --- a/Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 @@ -1,5 +1,5 @@ $script:DSCModuleName = 'SqlServerDsc' -$script:DSCResourceName = 'MSFT_SqlServerDSCConfiguration' +$script:DSCResourceName = 'MSFT_SqlServerConfiguration' # Unit Test Template Version: 1.1.0 [String] $script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) From 8f03dca6fcf2c23cfc672b570cf72e803f338d6b Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Tue, 7 Nov 2017 19:00:15 -0600 Subject: [PATCH 08/42] correct the line length errors called out in linting tests --- CONTRIBUTING.md | 5 +++-- README.md | 12 ++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 65c7ca846..7e79d94f8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -340,8 +340,9 @@ When sending in a Pull Request (PR) all example files will be tested so they can be compiled to a .mof file. If the tests find any errors the build will fail. Before the test runs in AppVeyor the module will be copied to the first path of `$env:PSModulePath`. -To run this test locally, make sure you have the SqlServerDSC module deployed to a -path where it can be used. See `$env:PSModulePath` to view the existing paths. +To run this test locally, make sure you have the SqlServerDSC module +deployed to a path where it can be used. +See `$env:PSModulePath` to view the existing paths. #### Using SMO stub classes diff --git a/README.md b/README.md index 04837d120..a64688c02 100644 --- a/README.md +++ b/README.md @@ -93,10 +93,10 @@ Get-DscResource -Module SqlServerDSC ## Requirements -The minimum Windows Management Framework (PowerShell) version required is 5.0 or higher, -which ships with Windows 10 or Windows Server 2016, -but can also be installed on Windows 7 SP1, Windows 8.1, Windows Server 2008 R2 SP1, -Windows Server 2012 and Windows Server 2012 R2. +The minimum Windows Management Framework (PowerShell) version required is 5.0 +or higher, which ships with Windows 10 or Windows Server 2016, +but can also be installed on Windows 7 SP1, Windows 8.1, +Windows Server 2008 R2 SP1, Windows Server 2012 and Windows Server 2012 R2. ## Examples @@ -161,8 +161,8 @@ A full list of changes in each version can be found in the [change log](CHANGELO * [**SqlServerServiceAccount**](#sqlserverserviceaccount) Manage the service account for SQL Server services. * [**SqlSetup**](#sqlsetup) installs a standalone SQL Server instance. -* [**SqlWaitForAvailabilityGroup**](#sqlwaitforavailabilitygroup) resource to wait until - availability group is created on primary server. +* [**SqlWaitForAvailabilityGroup**](#sqlwaitforavailabilitygroup) resource to + wait until availability group is created on primary server. ### SqlAlias From bd256a35c6e675030c7bb977e7b1a727a3f78654 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 9 Nov 2017 10:13:16 -0600 Subject: [PATCH 09/42] update pascal case in contributing page --- CONTRIBUTING.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7e79d94f8..a0a1b463e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ -# Contributing to SqlServerDSC +# Contributing to SqlServerDsc -If you are keen to make SqlServerDSC better, why not consider contributing your work +If you are keen to make SqlServerDsc better, why not consider contributing your work to the project? Every little change helps us make a better resource for everyone to use, and we would love to have contributions from the community. @@ -10,7 +10,7 @@ We follow all of the standard contribution guidelines for DSC resources [outlined in DscResources repository](https://github.com/PowerShell/DscResources/blob/master/CONTRIBUTING.md), so please review these as a baseline for contributing. -## SqlServerDSC specific guidelines +## SqlServerDsc specific guidelines ### Automatic formatting with VS Code @@ -280,7 +280,7 @@ $script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlSetup' To be able to support localization we have added wrappers for the cmdlets `Write-Verbose` and `Write-Warning`, and also for creating a terminating error message. -The localized strings are placed in a file named 'SqlServerDSCHelper.strings.psd1' +The localized strings are placed in a file named 'SqlServerDscHelper.strings.psd1' which are located in each language folder in the root of the module. For English language strings the folder is ['en-US'](https://github.com/PowerShell/xSQLServer/blob/dev/en-US). @@ -305,7 +305,7 @@ Helper functions or wrapper functions that are used by the resource can preferab be placed in the resource module file. If the functions are of a type that could be used by more than one resource, then the functions can also be placed in the common -[SqlServerDSCHelper.psm1](https://github.com/PowerShell/xSQLServer/blob/dev/SqlServerDSCHelper.psm1) +[SqlServerDscHelper.psm1](https://github.com/PowerShell/xSQLServer/blob/dev/SqlServerDscHelper.psm1) module file. ### Tests @@ -340,13 +340,13 @@ When sending in a Pull Request (PR) all example files will be tested so they can be compiled to a .mof file. If the tests find any errors the build will fail. Before the test runs in AppVeyor the module will be copied to the first path of `$env:PSModulePath`. -To run this test locally, make sure you have the SqlServerDSC module +To run this test locally, make sure you have the SqlServerDsc module deployed to a path where it can be used. See `$env:PSModulePath` to view the existing paths. #### Using SMO stub classes -There are [stub classes](https://github.com/PowerShell/SqlServerDSC/blob/dev/Tests/Unit/Stubs/SMO.cs) +There are [stub classes](https://github.com/PowerShell/SqlServerDsc/blob/dev/Tests/Unit/Stubs/SMO.cs) for the SMO classes which can be used and improved on when creating tests where SMO classes are used in the code being tested. From b3001000b98be9dfdfe24434b838228347aefec2 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 9 Nov 2017 10:14:02 -0600 Subject: [PATCH 10/42] correct pascal case in readme --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a64688c02..417f2e4b7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# SqlServerDSC +# SqlServerDsc -The **SqlServerDSC** module contains DSC resources +The **SqlServerDsc** module contains DSC resources for deployment and configuration of SQL Server. This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). @@ -74,21 +74,21 @@ We are here for each other. To manually install the module, download the source code and unzip the contents -of the '\Modules\SqlServerDSC' directory to the +of the '\Modules\SqlServerDsc' directory to the '$env:ProgramFiles\WindowsPowerShell\Modules' folder. To install from the PowerShell gallery using PowerShellGet (in PowerShell 5.0) run the following command: ```powershell -Find-Module -Name SqlServerDSC -Repository PSGallery | Install-Module +Find-Module -Name SqlServerDsc -Repository PSGallery | Install-Module ``` To confirm installation, run the below command and ensure you see the SQL Server DSC resources available: ```powershell -Get-DscResource -Module SqlServerDSC +Get-DscResource -Module SqlServerDsc ``` ## Requirements @@ -100,7 +100,7 @@ Windows Server 2008 R2 SP1, Windows Server 2012 and Windows Server 2012 R2. ## Examples -You can review the [Examples](/Examples) directory in the SqlServerDSC module +You can review the [Examples](/Examples) directory in the SqlServerDsc module for some general use scenarios for all of the resources that are in the module. ## Change log From ccd88a8ef69801b673fa381e9144d1df45887d2a Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 9 Nov 2017 10:17:46 -0600 Subject: [PATCH 11/42] naming corrects based on reviewable comments --- DSCResources/CommonResourceHelper.psm1 | 2 +- DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1 | 2 +- DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 | 2 +- DSCResources/MSFT_SqlAGListener/MSFT_SqlAGListener.psm1 | 2 +- DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1 | 2 +- README.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/DSCResources/CommonResourceHelper.psm1 b/DSCResources/CommonResourceHelper.psm1 index f130a804b..bf18d83b8 100644 --- a/DSCResources/CommonResourceHelper.psm1 +++ b/DSCResources/CommonResourceHelper.psm1 @@ -204,7 +204,7 @@ function New-InvalidResultException For WindowsOptionalFeature: MSFT_WindowsOptionalFeature For Service: MSFT_ServiceResource For Registry: MSFT_RegistryResource - For Helper: SqlServerDSCHelper + For Helper: SqlServerDscHelper .PARAMETER ScriptRoot Optional. The root path where to expect to find the culture folder. This is only needed diff --git a/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1 b/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1 index 5997d0b69..e5154e69f 100644 --- a/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1 +++ b/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# diff --git a/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 b/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 index 45b733e96..190211a82 100644 --- a/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 +++ b/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` diff --git a/DSCResources/MSFT_SqlAGListener/MSFT_SqlAGListener.psm1 b/DSCResources/MSFT_SqlAGListener/MSFT_SqlAGListener.psm1 index 3fcfe1a18..020f304c1 100644 --- a/DSCResources/MSFT_SqlAGListener/MSFT_SqlAGListener.psm1 +++ b/DSCResources/MSFT_SqlAGListener/MSFT_SqlAGListener.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1 b/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1 index 1a4c4e17c..2117f87b2 100644 --- a/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1 +++ b/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# diff --git a/README.md b/README.md index 417f2e4b7..ae2fc2a21 100644 --- a/README.md +++ b/README.md @@ -275,7 +275,7 @@ It will also manage the Availability Group replica on the specified node. * [Add a SQL Server Always On Availability Group and explicitly defines its properties](/Examples/Resources/SqlAG/3-CreateAvailabilityGroupDetailed.ps1) * [Remove a SQL Server Always On Availability Group](/Examples/Resources/SqlAG/2-RemoveAvailabilityGroup.ps1) -### SqlAGDatabaseMembership +### SqlAGDatabases This resource is used to add and/or remove databases to a specified availability group. From 9740967326cdee8e2d5f03583300baef871ddd6d Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 9 Nov 2017 10:33:02 -0600 Subject: [PATCH 12/42] naming issues per PR review comments --- .../SqlSetup/1-InstallDefaultInstanceSingleServer.ps1 | 2 +- ...nceSingleServerFromUncPathUsingSourceCredential.ps1 | 2 +- ...-InstallNamedInstanceInFailoverClusterFirstNode.ps1 | 2 +- ...InstallNamedInstanceInFailoverClusterSecondNode.ps1 | 2 +- .../1-WaitForASingleClusterGroup.ps1 | 2 +- .../2-WaitForMultipleClusterGroups.ps1 | 6 +++--- Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 | 4 ++-- .../MSFT_SqlDatabaseDefaultLocation.config.ps1 | 6 +++--- Tests/Integration/MSFT_SqlRS.config.ps1 | 2 +- Tests/SqlServerDSCCommon.Tests.ps1 | 6 +++--- Tests/Unit/MSFT_SqlAG.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 | 4 ++-- Tests/Unit/MSFT_SqlAGListener.Tests.ps1 | 6 +++--- Tests/Unit/MSFT_SqlAGReplica.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlDatabasePermission.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlDatabaseRole.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlScript.Tests.ps1 | 2 +- ...ount.Tests.ps1 => MSFT_SqlServiceAccount.Tests.ps1} | 2 +- ...lityGroup.Tests.ps1 => MSFT_SqlWaitForAG.Tests.ps1} | 2 +- Tests/Unit/SqlServerDSCHelper.Tests.ps1 | 8 ++++---- Tests/Unit/Stubs/SMO.cs | 10 +++++----- sv-SE/SqlServerDSCHelper.strings.psd1 | 2 +- 22 files changed, 39 insertions(+), 39 deletions(-) rename Examples/Resources/{SqlWaitForAvailabilityGroup => SqlWaitForAG}/1-WaitForASingleClusterGroup.ps1 (92%) rename Examples/Resources/{SqlWaitForAvailabilityGroup => SqlWaitForAG}/2-WaitForMultipleClusterGroups.ps1 (81%) rename Tests/Unit/{MSFT_SqlServerServiceAccount.Tests.ps1 => MSFT_SqlServiceAccount.Tests.ps1} (99%) rename Tests/Unit/{MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 => MSFT_SqlWaitForAG.Tests.ps1} (99%) diff --git a/Examples/Resources/SqlSetup/1-InstallDefaultInstanceSingleServer.ps1 b/Examples/Resources/SqlSetup/1-InstallDefaultInstanceSingleServer.ps1 index 7154381a9..9eafc2c7c 100644 --- a/Examples/Resources/SqlSetup/1-InstallDefaultInstanceSingleServer.ps1 +++ b/Examples/Resources/SqlSetup/1-InstallDefaultInstanceSingleServer.ps1 @@ -35,7 +35,7 @@ Configuration Example $SqlAgentServiceCredential = $SqlServiceCredential ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlSetup/3-InstallNamedInstanceSingleServerFromUncPathUsingSourceCredential.ps1 b/Examples/Resources/SqlSetup/3-InstallNamedInstanceSingleServerFromUncPathUsingSourceCredential.ps1 index 2ee22fadd..bdd01187b 100644 --- a/Examples/Resources/SqlSetup/3-InstallNamedInstanceSingleServerFromUncPathUsingSourceCredential.ps1 +++ b/Examples/Resources/SqlSetup/3-InstallNamedInstanceSingleServerFromUncPathUsingSourceCredential.ps1 @@ -39,7 +39,7 @@ Configuration Example $SqlAgentServiceCredential = $SqlServiceCredential ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlSetup/4-InstallNamedInstanceInFailoverClusterFirstNode.ps1 b/Examples/Resources/SqlSetup/4-InstallNamedInstanceInFailoverClusterFirstNode.ps1 index 3e2ddc3a2..8ddd54537 100644 --- a/Examples/Resources/SqlSetup/4-InstallNamedInstanceInFailoverClusterFirstNode.ps1 +++ b/Examples/Resources/SqlSetup/4-InstallNamedInstanceInFailoverClusterFirstNode.ps1 @@ -59,7 +59,7 @@ Configuration Example $SqlAgentServiceCredential = $SqlServiceCredential ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlSetup/5-InstallNamedInstanceInFailoverClusterSecondNode.ps1 b/Examples/Resources/SqlSetup/5-InstallNamedInstanceInFailoverClusterSecondNode.ps1 index 8961aaf9a..3bf76ce91 100644 --- a/Examples/Resources/SqlSetup/5-InstallNamedInstanceInFailoverClusterSecondNode.ps1 +++ b/Examples/Resources/SqlSetup/5-InstallNamedInstanceInFailoverClusterSecondNode.ps1 @@ -55,7 +55,7 @@ Configuration Example $SqlAgentServiceCredential = $SqlServiceCredential ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1 b/Examples/Resources/SqlWaitForAG/1-WaitForASingleClusterGroup.ps1 similarity index 92% rename from Examples/Resources/SqlWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1 rename to Examples/Resources/SqlWaitForAG/1-WaitForASingleClusterGroup.ps1 index 0624fe90c..f78de9b44 100644 --- a/Examples/Resources/SqlWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1 +++ b/Examples/Resources/SqlWaitForAG/1-WaitForASingleClusterGroup.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1 b/Examples/Resources/SqlWaitForAG/2-WaitForMultipleClusterGroups.ps1 similarity index 81% rename from Examples/Resources/SqlWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1 rename to Examples/Resources/SqlWaitForAG/2-WaitForMultipleClusterGroups.ps1 index 739ead20f..ef25ba152 100644 --- a/Examples/Resources/SqlWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1 +++ b/Examples/Resources/SqlWaitForAG/2-WaitForMultipleClusterGroups.ps1 @@ -12,11 +12,11 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc node localhost { - SqlWaitForAvailabilityGroup SQLConfigureAG-WaitAGTest1 + SqlWaitForAG SQLConfigureAG-WaitAGTest1 { Name = 'AGTest1' RetryIntervalSec = 20 @@ -25,7 +25,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - SqlWaitForAvailabilityGroup SQLConfigureAG-WaitAGTest2 + SqlWaitForAG SQLConfigureAG-WaitAGTest2 { Name = 'AGTest2' RetryIntervalSec = 20 diff --git a/Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 b/Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 index 1f1b75e1c..77e6f90ed 100644 --- a/Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 +++ b/Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 @@ -26,7 +26,7 @@ Configuration MSFT_SqlAlwaysOnService_EnableAlwaysOn_Config ) Import-DscResource -ModuleName 'PSDscResources' - Import-DscResource -ModuleName 'SqlServerDSC' + Import-DscResource -ModuleName 'SqlServerDsc' node localhost { WindowsFeature 'AddFeatureFailoverClustering' @@ -151,7 +151,7 @@ Configuration MSFT_SqlAlwaysOnService_DisableAlwaysOn_Config $SqlInstallCredential ) - Import-DscResource -ModuleName 'SqlServerDSC' + Import-DscResource -ModuleName 'SqlServerDsc' node localhost { SqlAlwaysOnService 'Integration_Test' diff --git a/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 b/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 index bc5650b57..3a55bc697 100644 --- a/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 +++ b/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 @@ -30,7 +30,7 @@ Configuration MSFT_SqlDatabaseDefaultLocation_Data_Config ) Import-DscResource -ModuleName 'PSDesiredStateConfiguration' - Import-DscResource -ModuleName 'SqlServerDSC' + Import-DscResource -ModuleName 'SqlServerDsc' node localhost { File 'SQLDataPath' @@ -68,7 +68,7 @@ Configuration MSFT_SqlDatabaseDefaultLocation_Log_Config ) Import-DscResource -ModuleName 'PSDesiredStateConfiguration' - Import-DscResource -ModuleName 'SqlServerDSC' + Import-DscResource -ModuleName 'SqlServerDsc' node localhost { File 'SQLLogPath' @@ -106,7 +106,7 @@ Configuration MSFT_SqlDatabaseDefaultLocation_Backup_Config ) Import-DscResource -ModuleName 'PSDesiredStateConfiguration' - Import-DscResource -ModuleName 'SqlServerDSC' + Import-DscResource -ModuleName 'SqlServerDsc' node localhost { File 'SQLBackupPath' diff --git a/Tests/Integration/MSFT_SqlRS.config.ps1 b/Tests/Integration/MSFT_SqlRS.config.ps1 index 4efc2c151..f6e9b5898 100644 --- a/Tests/Integration/MSFT_SqlRS.config.ps1 +++ b/Tests/Integration/MSFT_SqlRS.config.ps1 @@ -52,7 +52,7 @@ Configuration MSFT_SqlRS_InstallReportingServices_Config Import-DscResource -ModuleName 'PSDscResources' Import-DscResource -ModuleName 'xStorage' - Import-DscResource -ModuleName 'SqlServerDSC' + Import-DscResource -ModuleName 'SqlServerDsc' node localhost { xMountImage 'MountIsoMedia' diff --git a/Tests/SqlServerDSCCommon.Tests.ps1 b/Tests/SqlServerDSCCommon.Tests.ps1 index 366949946..43c3f6d17 100644 --- a/Tests/SqlServerDSCCommon.Tests.ps1 +++ b/Tests/SqlServerDSCCommon.Tests.ps1 @@ -5,7 +5,7 @@ param() $script:moduleRoot = Split-Path $PSScriptRoot -Parent -Describe 'SqlServerDSC module common tests' { +Describe 'SqlServerDsc module common tests' { Context -Name 'When there are example file for resource' { <# For Appveyor builds copy the module to the system modules directory so it falls @@ -13,7 +13,7 @@ Describe 'SqlServerDSC module common tests' { #> if ($env:APPVEYOR) { - $powershellModulePath = Join-Path -Path (($env:PSModulePath -split ';')[0]) -ChildPath 'SqlServerDSC' + $powershellModulePath = Join-Path -Path (($env:PSModulePath -split ';')[0]) -ChildPath 'SqlServerDsc' Copy-item -Path $env:APPVEYOR_BUILD_FOLDER -Destination $powershellModulePath -Recurse -Force } @@ -69,7 +69,7 @@ Describe 'SqlServerDSC module common tests' { Remove-item -Path $powershellModulePath -Recurse -Force -Confirm:$false # Restore the module in 'memory' to ensure other tests after this test have access to it - Import-Module -Name "$script:moduleRoot\SqlServerDSC.psd1" -Global -Force + Import-Module -Name "$script:moduleRoot\SqlServerDsc.psd1" -Global -Force } } } diff --git a/Tests/Unit/MSFT_SqlAG.Tests.ps1 b/Tests/Unit/MSFT_SqlAG.Tests.ps1 index 763f1a465..d0eb895b0 100644 --- a/Tests/Unit/MSFT_SqlAG.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAG.Tests.ps1 @@ -12,7 +12,7 @@ Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -P Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'Tests' -ChildPath (Join-Path -Path 'TestHelpers' -ChildPath 'CommonTestHelper.psm1'))) -Force -Global $TestEnvironment = Initialize-TestEnvironment ` - -DSCModuleName 'SqlServerDSC' ` + -DSCModuleName 'SqlServerDsc' ` -DSCResourceName 'MSFT_SqlAG' ` -TestType Unit diff --git a/Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 b/Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 index 50d21d59e..fdf324e13 100644 --- a/Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 @@ -9,14 +9,14 @@ if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCR } Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force -Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent | Split-Path -Parent) -ChildPath 'SqlServerDSCHelper.psm1') -Scope Global -Force +Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent | Split-Path -Parent) -ChildPath 'SqlServerDscHelper.psm1') -Scope Global -Force Import-Module -Name ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stubs ) -ChildPath SQLPSStub.psm1 ) -Force -Global # Loading mocked classes Add-Type -Path ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stubs ) -ChildPath SMO.cs ) $TestEnvironment = Initialize-TestEnvironment ` - -DSCModuleName 'SqlServerDSC' ` + -DSCModuleName 'SqlServerDsc' ` -DSCResourceName 'MSFT_SqlAGDatabases' ` -TestType Unit diff --git a/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 b/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 index db2b6954d..9c2ae885f 100644 --- a/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 @@ -93,7 +93,7 @@ try #endregion Pester Test Initialization - Describe 'SqlServerDSCAvailabilityGroupListener\Get-TargetResource' { + Describe 'SqlServerAGListener\Get-TargetResource' { BeforeEach { $testParameters = $defaultParameters.Clone() @@ -224,7 +224,7 @@ try Assert-VerifiableMock } - Describe 'SqlServerDSCAvailabilityGroupListener\Test-TargetResource' { + Describe 'SqlServerAGListener\Test-TargetResource' { BeforeEach { $testParameters = $defaultParameters.Clone() } @@ -509,7 +509,7 @@ try Assert-VerifiableMock } - Describe 'SqlServerDSCAvailabilityGroupListener\Set-TargetResource' { + Describe 'SqlServerAGListener\Set-TargetResource' { BeforeEach { $testParameters = $defaultParameters.Clone() diff --git a/Tests/Unit/MSFT_SqlAGReplica.Tests.ps1 b/Tests/Unit/MSFT_SqlAGReplica.Tests.ps1 index 5726f1bbf..65f8a6758 100644 --- a/Tests/Unit/MSFT_SqlAGReplica.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAGReplica.Tests.ps1 @@ -13,7 +13,7 @@ Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -P Add-Type -Path ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stubs ) -ChildPath SMO.cs ) $TestEnvironment = Initialize-TestEnvironment ` - -DSCModuleName 'SqlServerDSC' ` + -DSCModuleName 'SqlServerDsc' ` -DSCResourceName 'MSFT_SqlAGReplica' ` -TestType Unit diff --git a/Tests/Unit/MSFT_SqlDatabasePermission.Tests.ps1 b/Tests/Unit/MSFT_SqlDatabasePermission.Tests.ps1 index 7d48a84c7..e7919c6ce 100644 --- a/Tests/Unit/MSFT_SqlDatabasePermission.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlDatabasePermission.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SqlServerDSC' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlDatabasePermission' #region HEADER diff --git a/Tests/Unit/MSFT_SqlDatabaseRole.Tests.ps1 b/Tests/Unit/MSFT_SqlDatabaseRole.Tests.ps1 index bb077a590..5d51c8c30 100644 --- a/Tests/Unit/MSFT_SqlDatabaseRole.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlDatabaseRole.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SqlServerDSC' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlDatabaseRole' #region HEADER diff --git a/Tests/Unit/MSFT_SqlScript.Tests.ps1 b/Tests/Unit/MSFT_SqlScript.Tests.ps1 index cb01b8bbc..579c68c2b 100644 --- a/Tests/Unit/MSFT_SqlScript.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlScript.Tests.ps1 @@ -20,7 +20,7 @@ if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCR Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force $TestEnvironment = Initialize-TestEnvironment ` - -DSCModuleName 'SqlServerDSC' ` + -DSCModuleName 'SqlServerDsc' ` -DSCResourceName 'MSFT_SqlScript' ` -TestType Unit diff --git a/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 b/Tests/Unit/MSFT_SqlServiceAccount.Tests.ps1 similarity index 99% rename from Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 rename to Tests/Unit/MSFT_SqlServiceAccount.Tests.ps1 index 7a3024225..dec24cb26 100644 --- a/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServiceAccount.Tests.ps1 @@ -1,5 +1,5 @@ $script:DSCModuleName = 'SqlServerDsc' -$script:DSCResourceName = 'MSFT_SqlServerServiceAccount' +$script:DSCResourceName = 'MSFT_SqlServiceAccount' #region HEADER diff --git a/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 b/Tests/Unit/MSFT_SqlWaitForAG.Tests.ps1 similarity index 99% rename from Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 rename to Tests/Unit/MSFT_SqlWaitForAG.Tests.ps1 index 7b850a125..8b21a4e3c 100644 --- a/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlWaitForAG.Tests.ps1 @@ -1,5 +1,5 @@ $script:DSCModuleName = 'SqlServerDsc' -$script:DSCResourceName = 'MSFT_SqlWaitForAvailabilityGroup' +$script:DSCResourceName = 'MSFT_SqlWaitForAG' #region HEADER diff --git a/Tests/Unit/SqlServerDSCHelper.Tests.ps1 b/Tests/Unit/SqlServerDSCHelper.Tests.ps1 index 74c334dd0..8f2cdd52c 100644 --- a/Tests/Unit/SqlServerDSCHelper.Tests.ps1 +++ b/Tests/Unit/SqlServerDSCHelper.Tests.ps1 @@ -4,7 +4,7 @@ param () # Unit Test Template Version: 1.1.0 -$script:moduleName = 'SqlServerDSCHelper' +$script:moduleName = 'SqlServerDscHelper' [String] $script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` @@ -14,7 +14,7 @@ if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCR } Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force -Import-Module (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent | Split-Path -Parent) -ChildPath 'SqlServerDSCHelper.psm1') -Scope Global -Force +Import-Module (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent | Split-Path -Parent) -ChildPath 'SqlServerDscHelper.psm1') -Scope Global -Force # Loading mocked classes Add-Type -Path ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stubs ) -ChildPath SMO.cs ) @@ -786,7 +786,7 @@ InModuleScope $script:moduleName { Assert-VerifiableMock } - $mockApplicationDomainName = 'SqlServerDSCHelperTests' + $mockApplicationDomainName = 'SqlServerDscHelperTests' $mockApplicationDomainObject = [System.AppDomain]::CreateDomain($mockApplicationDomainName) <# @@ -836,7 +836,7 @@ InModuleScope $script:moduleName { } -Verifiable Mock -CommandName Register-SqlSmo -MockWith { - [System.AppDomain]::CreateDomain('SqlServerDSCHelper') + [System.AppDomain]::CreateDomain('SqlServerDscHelper') } -ParameterFilter { $SQLInstanceName -eq $mockInstanceName } -Verifiable diff --git a/Tests/Unit/Stubs/SMO.cs b/Tests/Unit/Stubs/SMO.cs index 1a47a84d4..18b840277 100644 --- a/Tests/Unit/Stubs/SMO.cs +++ b/Tests/Unit/Stubs/SMO.cs @@ -542,7 +542,7 @@ public ServerRole( Object server, string name ) { // TypeName: Microsoft.SqlServer.Management.Smo.Database // BaseType: Microsoft.SqlServer.Management.Smo.ScriptNameObjectBase // Used by: - // MSFT_SqlAGDatabaseMembership + // MSFT_SqlAGDatabases // MSFT_SqlDatabase // MSFT_SqlDatabasePermission public class Database @@ -697,7 +697,7 @@ public FailedOperationException (string message, SmoException inner) : base (mes // TypeName: Microsoft.SqlServer.Management.Smo.AvailabilityGroup // BaseType: Microsoft.SqlServer.Management.Smo.NamedSmoObject // Used by: - // SqlServerAG + // SqlAG public class AvailabilityGroup { public AvailabilityGroup() @@ -856,7 +856,7 @@ public class DatabaseEncryptionKey // TypeName: Microsoft.SqlServer.Management.Smo.Certificate // Used by: - // SqlAGDatabaseMembership + // SqlAGDatabases public class Certificate { public byte[] Thumbprint; @@ -864,7 +864,7 @@ public class Certificate // TypeName: Microsoft.SqlServer.Management.Smo.AvailabilityDatabaseCollection // Used by: - // SqlAGDatabaseMembership + // SqlAGDatabases public class AvailabilityDatabaseCollection : Collection { public AvailabilityDatabase this[string name] @@ -947,7 +947,7 @@ namespace Microsoft.SqlServer.Management.Smo.Wmi // TypeName: Microsoft.SqlServer.Management.Smo.Wmi.ManagedServiceType // Used by: - // MSFT_SqlServerServiceAccount.Tests.ps1 + // MSFT_SqlServiceAccount.Tests.ps1 public enum ManagedServiceType { SqlServer = 1, diff --git a/sv-SE/SqlServerDSCHelper.strings.psd1 b/sv-SE/SqlServerDSCHelper.strings.psd1 index e192a2252..c3dd3e7c7 100644 --- a/sv-SE/SqlServerDSCHelper.strings.psd1 +++ b/sv-SE/SqlServerDSCHelper.strings.psd1 @@ -1,4 +1,4 @@ -# Swedish localized resources for helper module SqlServerDSCHelper. +# Swedish localized resources for helper module SqlServerDscHelper. ConvertFrom-StringData @' ConnectedToDatabaseEngineInstance = Ansluten till SQL instans '{0}'. From f5d26ff7c258b99cd3164ecac3ceec9b0dc31386 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 9 Nov 2017 10:55:47 -0600 Subject: [PATCH 13/42] many naming fixes from PR comments --- CHANGELOG.md | 25 ++++++++------- CONTRIBUTING.md | 6 ++-- DSCResources/MSFT_SqlAlias/MSFT_SqlAlias.psm1 | 2 +- .../MSFT_SqlAlwaysOnService.psm1 | 2 +- .../MSFT_SqlDatabase/MSFT_SqlDatabase.psm1 | 2 +- .../MSFT_SqlDatabaseDefaultLocation.psm1 | 2 +- .../MSFT_SqlDatabaseOwner.psm1 | 2 +- .../MSFT_SqlDatabasePermission.psm1 | 2 +- .../MSFT_SqlDatabaseRecoveryModel.psm1 | 2 +- .../MSFT_SqlDatabaseRole.psm1 | 2 +- DSCResources/MSFT_SqlRS/MSFT_SqlRS.psm1 | 2 +- .../MSFT_SqlRSSecureConnectionLevel.psm1 | 2 +- .../MSFT_SqlScript/MSFT_SqlScript.psm1 | 2 +- .../MSFT_SqlServerConfiguration.psm1 | 2 +- .../MSFT_SqlServerEndpoint.psm1 | 2 +- .../MSFT_SqlServerEndpointPermission.psm1 | 2 +- .../MSFT_SqlServerEndpointState.psm1 | 2 +- .../MSFT_SqlServerLogin.psm1 | 2 +- .../MSFT_SqlServerMaxDop.psm1 | 2 +- .../MSFT_SqlServerMemory.psm1 | 2 +- .../MSFT_SqlServerNetwork.psm1 | 2 +- .../MSFT_SqlServerPermission.psm1 | 2 +- .../MSFT_SqlServerRole.psm1 | 2 +- .../MSFT_SqlServiceAccount.psm1} | 4 +-- .../MSFT_SqlServiceAccount.schema.mof} | 4 +-- .../MSFT_SqlServiceAccount.strings.psd1} | 2 +- DSCResources/MSFT_SqlSetup/MSFT_SqlSetup.psm1 | 2 +- .../MSFT_SqlWaitForAG.psm1} | 2 +- .../MSFT_SqlWaitForAG.schema.mof} | 4 +-- .../MSFT_SqlWindowsFirewall.psm1 | 2 +- Examples/Resources/SqlAlias/1-AddSqlAlias.ps1 | 2 +- .../Resources/SqlAlias/2-RemoveSqlAlias.ps1 | 2 +- .../1-RunScriptUsingSQLAuthentication.ps1 | 2 +- .../2-RunScriptUsingWindowsAuthentication.ps1 | 2 +- .../1-CreateEndpointWithDefaultValues.ps1 | 2 +- ...teEndpointWithSpecificPortAndIPAddress.ps1 | 2 +- .../SqlServerEndpoint/3-RemoveEndpoint.ps1 | 2 +- .../1-AddConnectPermission.ps1 | 2 +- .../2-RemoveConnectPermission.ps1 | 2 +- ...icaEachWithDifferentSqlServiceAccounts.ps1 | 2 +- ...icaEachWithDifferentSqlServiceAccounts.ps1 | 2 +- .../1-MakeSureEndpointIsStarted.ps1 | 2 +- .../2-MakeSureEndpointIsStopped.ps1 | 2 +- .../1-ConfigureServiceAccount-UserAccount.ps1 | 0 ...ConfigureServiceAccount-VirtualAccount.ps1 | 0 README.md | 32 +++++++++---------- SQLServerDSC.psd1 | 2 +- SqlServerDSCHelper.psm1 | 2 +- en-US/SqlServerDSCHelper.strings.psd1 | 4 +-- 49 files changed, 81 insertions(+), 78 deletions(-) rename DSCResources/{MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.psm1 => MSFT_SqlServiceAccount/MSFT_SqlServiceAccount.psm1} (99%) rename DSCResources/{MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.schema.mof => MSFT_SqlServiceAccount/MSFT_SqlServiceAccount.schema.mof} (88%) rename DSCResources/{MSFT_SqlServerServiceAccount/en-US/MSFT_SqlServerServiceAccount.strings.psd1 => MSFT_SqlServiceAccount/en-US/MSFT_SqlServiceAccount.strings.psd1} (92%) rename DSCResources/{MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.psm1 => MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.psm1} (99%) rename DSCResources/{MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.schema.mof => MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.schema.mof} (84%) rename Examples/Resources/{SqlServerServiceAccount => SqlServiceAccount}/1-ConfigureServiceAccount-UserAccount.ps1 (100%) rename Examples/Resources/{SqlServerServiceAccount => SqlServiceAccount}/2-ConfigureServiceAccount-VirtualAccount.ps1 (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index db2d779d4..df4579989 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,9 @@ ## Unreleased -- Significant rename to reduce length of Resource names - - BREAKING CHANGE +- BREAKING CHANGE: Significant rename to reduce length of Resource names + - See [issue #851](https://github.com/PowerShell/xSQLServer/issues/851) for a + complete table mapping rename changes. - Impact to all resources ## 9.0.0.0 @@ -11,12 +12,12 @@ - Changes to xSQLServer - Updated Pester syntax to v4 - Fixes broken links to issues in the CHANGELOG.md. -- Changes to xSQLServerDatabase +- Changes to SqlDatabase - Added parameter to specify collation for a database to be different from server collation ([issue #767](https://github.com/PowerShell/xSQLServer/issues/767)). - Fixed unit tests for Get-TargetResource to ensure correctly testing return values ([issue #849](https://github.com/PowerShell/xSQLServer/issues/849)) -- Changes to xSQLServerAlwaysOnAvailabilityGroup +- Changes to SqlAG - Refactored the unit tests to allow them to be more user friendly and to test additional SQLServer variations. - Each test will utilize the Import-SQLModuleStub to ensure the correct @@ -29,22 +30,22 @@ - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, the resource will only determine if a change is needed if the target node is the active host of the SQL Server instance ([issue #868](https://github.com/PowerShell/xSQLServer/issues/868)). -- Changes to xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership +- Changes to SqlAGDatabases - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, the resource will only determine if a change is needed if the target node is the active host of the SQL Server instance ([issue #869](https://github.com/PowerShell/xSQLServer/issues/869)). -- Changes to xSQLServerAlwaysOnAvailabilityGroupReplica +- Changes to SqlAGReplica - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, the resource will only determine if a change is needed if the target node is the active host of the SQL Server instance ([issue #870](https://github.com/PowerShell/xSQLServer/issues/870)). - Added the CommonTestHelper.psm1 to store common testing functions. - Added the Import-SQLModuleStub function to ensure the correct version of the module stubs are loaded ([issue #784](https://github.com/PowerShell/xSQLServer/issues/784)). -- Changes to xSQLServerMemory +- Changes to SqlServerMemory - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, the resource will only determine if a change is needed if the target node is the active host of the SQL Server instance ([issue #867](https://github.com/PowerShell/xSQLServer/issues/867)). -- Changes to xSQLServerNetwork +- Changes to SqlServerNetwork - BREAKING CHANGE: Renamed parameter TcpDynamicPorts to TcpDynamicPort and changed type to Boolean ([issue #534](https://github.com/PowerShell/xSQLServer/issues/534)). - Resolved issue when switching from dynamic to static port. @@ -52,15 +53,15 @@ - Added localization (en-US) for all strings in resource and unit tests ([issue #618](https://github.com/PowerShell/xSQLServer/issues/618)). - Updated examples to reflect new parameters. -- Changes to xSQLServerRSConfig +- Changes to SqlRS - Added examples - Added resource - - xSQLServerDatabaseDefaultLocation + - SqlDatabaseDefaultLocation ([issue #656](https://github.com/PowerShell/xSQLServer/issues/656)) -- Changes to xSQLServerEndpointPermission +- Changes to SqlServerEndpointPermission - Fixed a problem when running the tests locally in a PowerShell console it would ask for parameters ([issue #897](https://github.com/PowerShell/xSQLServer/issues/897)). -- Changes to xSQLServerAvailabilityGroupListener +- Changes to SqlAGListener - Fixed a problem when running the tests locally in a PowerShell console it would ask for parameters ([issue #897](https://github.com/PowerShell/xSQLServer/issues/897)). - Changes to xSQLServerMaxDop diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a0a1b463e..fdd506837 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -34,6 +34,8 @@ Those SQL Server products that are still supported can be listed at the ### Naming convention +[][]{ | } + #### mof-based resource All mof-based resource (with Get/Set/Test-TargetResource) should be prefixed with @@ -282,7 +284,7 @@ To be able to support localization we have added wrappers for the cmdlets message. The localized strings are placed in a file named 'SqlServerDscHelper.strings.psd1' which are located in each language folder in the root of the module. For English -language strings the folder is ['en-US'](https://github.com/PowerShell/xSQLServer/blob/dev/en-US). +language strings the folder is ['en-US'](https://github.com/PowerShell/SqlServerDsc/blob/dev/en-US). ##### New-TerminatingError @@ -305,7 +307,7 @@ Helper functions or wrapper functions that are used by the resource can preferab be placed in the resource module file. If the functions are of a type that could be used by more than one resource, then the functions can also be placed in the common -[SqlServerDscHelper.psm1](https://github.com/PowerShell/xSQLServer/blob/dev/SqlServerDscHelper.psm1) +[SqlServerDscHelper.psm1](https://github.com/PowerShell/SqlServerDsc/blob/dev/SqlServerDscHelper.psm1) module file. ### Tests diff --git a/DSCResources/MSFT_SqlAlias/MSFT_SqlAlias.psm1 b/DSCResources/MSFT_SqlAlias/MSFT_SqlAlias.psm1 index 1b71a5753..dd4f15bc5 100644 --- a/DSCResources/MSFT_SqlAlias/MSFT_SqlAlias.psm1 +++ b/DSCResources/MSFT_SqlAlias/MSFT_SqlAlias.psm1 @@ -1,4 +1,4 @@ -Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) -ChildPath 'SqlServerDSCHelper.psm1') -Force +Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) -ChildPath 'SqlServerDscHelper.psm1') -Force function Get-TargetResource { diff --git a/DSCResources/MSFT_SqlAlwaysOnService/MSFT_SqlAlwaysOnService.psm1 b/DSCResources/MSFT_SqlAlwaysOnService/MSFT_SqlAlwaysOnService.psm1 index aeaed1b57..268366074 100644 --- a/DSCResources/MSFT_SqlAlwaysOnService/MSFT_SqlAlwaysOnService.psm1 +++ b/DSCResources/MSFT_SqlAlwaysOnService/MSFT_SqlAlwaysOnService.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# diff --git a/DSCResources/MSFT_SqlDatabase/MSFT_SqlDatabase.psm1 b/DSCResources/MSFT_SqlDatabase/MSFT_SqlDatabase.psm1 index 80328613e..48a6e37ab 100644 --- a/DSCResources/MSFT_SqlDatabase/MSFT_SqlDatabase.psm1 +++ b/DSCResources/MSFT_SqlDatabase/MSFT_SqlDatabase.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_SqlDatabaseDefaultLocation/MSFT_SqlDatabaseDefaultLocation.psm1 b/DSCResources/MSFT_SqlDatabaseDefaultLocation/MSFT_SqlDatabaseDefaultLocation.psm1 index 9a89643df..9dfed06a0 100644 --- a/DSCResources/MSFT_SqlDatabaseDefaultLocation/MSFT_SqlDatabaseDefaultLocation.psm1 +++ b/DSCResources/MSFT_SqlDatabaseDefaultLocation/MSFT_SqlDatabaseDefaultLocation.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` diff --git a/DSCResources/MSFT_SqlDatabaseOwner/MSFT_SqlDatabaseOwner.psm1 b/DSCResources/MSFT_SqlDatabaseOwner/MSFT_SqlDatabaseOwner.psm1 index 1ccf08fef..a947278d4 100644 --- a/DSCResources/MSFT_SqlDatabaseOwner/MSFT_SqlDatabaseOwner.psm1 +++ b/DSCResources/MSFT_SqlDatabaseOwner/MSFT_SqlDatabaseOwner.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_SqlDatabasePermission/MSFT_SqlDatabasePermission.psm1 b/DSCResources/MSFT_SqlDatabasePermission/MSFT_SqlDatabasePermission.psm1 index ac1f6a8bd..3f3bc4124 100644 --- a/DSCResources/MSFT_SqlDatabasePermission/MSFT_SqlDatabasePermission.psm1 +++ b/DSCResources/MSFT_SqlDatabasePermission/MSFT_SqlDatabasePermission.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_SqlDatabaseRecoveryModel/MSFT_SqlDatabaseRecoveryModel.psm1 b/DSCResources/MSFT_SqlDatabaseRecoveryModel/MSFT_SqlDatabaseRecoveryModel.psm1 index 2f91d1a7e..d24d89555 100644 --- a/DSCResources/MSFT_SqlDatabaseRecoveryModel/MSFT_SqlDatabaseRecoveryModel.psm1 +++ b/DSCResources/MSFT_SqlDatabaseRecoveryModel/MSFT_SqlDatabaseRecoveryModel.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_SqlDatabaseRole/MSFT_SqlDatabaseRole.psm1 b/DSCResources/MSFT_SqlDatabaseRole/MSFT_SqlDatabaseRole.psm1 index 0eb032815..5460ec7d3 100644 --- a/DSCResources/MSFT_SqlDatabaseRole/MSFT_SqlDatabaseRole.psm1 +++ b/DSCResources/MSFT_SqlDatabaseRole/MSFT_SqlDatabaseRole.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# diff --git a/DSCResources/MSFT_SqlRS/MSFT_SqlRS.psm1 b/DSCResources/MSFT_SqlRS/MSFT_SqlRS.psm1 index bf4e62655..49a24f184 100644 --- a/DSCResources/MSFT_SqlRS/MSFT_SqlRS.psm1 +++ b/DSCResources/MSFT_SqlRS/MSFT_SqlRS.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# diff --git a/DSCResources/MSFT_SqlRSSecureConnectionLevel/MSFT_SqlRSSecureConnectionLevel.psm1 b/DSCResources/MSFT_SqlRSSecureConnectionLevel/MSFT_SqlRSSecureConnectionLevel.psm1 index ad84790e3..e20d298f3 100644 --- a/DSCResources/MSFT_SqlRSSecureConnectionLevel/MSFT_SqlRSSecureConnectionLevel.psm1 +++ b/DSCResources/MSFT_SqlRSSecureConnectionLevel/MSFT_SqlRSSecureConnectionLevel.psm1 @@ -2,7 +2,7 @@ $currentPath = Split-Path -Parent $MyInvocation.MyCommand.Path Write-Debug -Message "CurrentPath: $currentPath" # Load Common Code -Import-Module $currentPath\..\..\SqlServerDSCHelper.psm1 -Verbose:$false -ErrorAction Stop +Import-Module $currentPath\..\..\SqlServerDscHelper.psm1 -Verbose:$false -ErrorAction Stop function Get-TargetResource { diff --git a/DSCResources/MSFT_SqlScript/MSFT_SqlScript.psm1 b/DSCResources/MSFT_SqlScript/MSFT_SqlScript.psm1 index d7e02b503..2b0cf0b70 100644 --- a/DSCResources/MSFT_SqlScript/MSFT_SqlScript.psm1 +++ b/DSCResources/MSFT_SqlScript/MSFT_SqlScript.psm1 @@ -1,5 +1,5 @@ $script:currentPath = Split-Path -Path $MyInvocation.MyCommand.Path -Parent -Import-Module -Name (Join-Path -Path (Split-Path -Path (Split-Path -Path $script:currentPath -Parent) -Parent) -ChildPath 'SqlServerDSCHelper.psm1') +Import-Module -Name (Join-Path -Path (Split-Path -Path (Split-Path -Path $script:currentPath -Parent) -Parent) -ChildPath 'SqlServerDscHelper.psm1') <# .SYNOPSIS diff --git a/DSCResources/MSFT_SqlServerConfiguration/MSFT_SqlServerConfiguration.psm1 b/DSCResources/MSFT_SqlServerConfiguration/MSFT_SqlServerConfiguration.psm1 index 34ac3752c..feb90ed26 100644 --- a/DSCResources/MSFT_SqlServerConfiguration/MSFT_SqlServerConfiguration.psm1 +++ b/DSCResources/MSFT_SqlServerConfiguration/MSFT_SqlServerConfiguration.psm1 @@ -1,6 +1,6 @@ # Load Common Code Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_SqlServerEndpoint/MSFT_SqlServerEndpoint.psm1 b/DSCResources/MSFT_SqlServerEndpoint/MSFT_SqlServerEndpoint.psm1 index ff61a36d5..ce716358c 100644 --- a/DSCResources/MSFT_SqlServerEndpoint/MSFT_SqlServerEndpoint.psm1 +++ b/DSCResources/MSFT_SqlServerEndpoint/MSFT_SqlServerEndpoint.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_SqlServerEndpointPermission/MSFT_SqlServerEndpointPermission.psm1 b/DSCResources/MSFT_SqlServerEndpointPermission/MSFT_SqlServerEndpointPermission.psm1 index dd0bb9a37..3e9df85f0 100644 --- a/DSCResources/MSFT_SqlServerEndpointPermission/MSFT_SqlServerEndpointPermission.psm1 +++ b/DSCResources/MSFT_SqlServerEndpointPermission/MSFT_SqlServerEndpointPermission.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_SqlServerEndpointState/MSFT_SqlServerEndpointState.psm1 b/DSCResources/MSFT_SqlServerEndpointState/MSFT_SqlServerEndpointState.psm1 index ea2753091..9e81c222a 100644 --- a/DSCResources/MSFT_SqlServerEndpointState/MSFT_SqlServerEndpointState.psm1 +++ b/DSCResources/MSFT_SqlServerEndpointState/MSFT_SqlServerEndpointState.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_SqlServerLogin/MSFT_SqlServerLogin.psm1 b/DSCResources/MSFT_SqlServerLogin/MSFT_SqlServerLogin.psm1 index 14d7f15ea..11f3ae3f1 100644 --- a/DSCResources/MSFT_SqlServerLogin/MSFT_SqlServerLogin.psm1 +++ b/DSCResources/MSFT_SqlServerLogin/MSFT_SqlServerLogin.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# diff --git a/DSCResources/MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.psm1 b/DSCResources/MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.psm1 index 1bd3c5ee9..e43239203 100644 --- a/DSCResources/MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.psm1 +++ b/DSCResources/MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_SqlServerMemory/MSFT_SqlServerMemory.psm1 b/DSCResources/MSFT_SqlServerMemory/MSFT_SqlServerMemory.psm1 index 9b53b3400..53446ea21 100644 --- a/DSCResources/MSFT_SqlServerMemory/MSFT_SqlServerMemory.psm1 +++ b/DSCResources/MSFT_SqlServerMemory/MSFT_SqlServerMemory.psm1 @@ -1,4 +1,4 @@ -Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) -ChildPath 'SqlServerDSCHelper.psm1') -Force +Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) -ChildPath 'SqlServerDscHelper.psm1') -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_SqlServerNetwork/MSFT_SqlServerNetwork.psm1 b/DSCResources/MSFT_SqlServerNetwork/MSFT_SqlServerNetwork.psm1 index f20b9477e..589b22d29 100644 --- a/DSCResources/MSFT_SqlServerNetwork/MSFT_SqlServerNetwork.psm1 +++ b/DSCResources/MSFT_SqlServerNetwork/MSFT_SqlServerNetwork.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') -Force + -ChildPath 'SqlServerDscHelper.psm1') -Force Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` -ChildPath 'CommonResourceHelper.psm1') diff --git a/DSCResources/MSFT_SqlServerPermission/MSFT_SqlServerPermission.psm1 b/DSCResources/MSFT_SqlServerPermission/MSFT_SqlServerPermission.psm1 index c24dd413f..f6c572c14 100644 --- a/DSCResources/MSFT_SqlServerPermission/MSFT_SqlServerPermission.psm1 +++ b/DSCResources/MSFT_SqlServerPermission/MSFT_SqlServerPermission.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_SqlServerRole/MSFT_SqlServerRole.psm1 b/DSCResources/MSFT_SqlServerRole/MSFT_SqlServerRole.psm1 index 4df469fab..78552114c 100644 --- a/DSCResources/MSFT_SqlServerRole/MSFT_SqlServerRole.psm1 +++ b/DSCResources/MSFT_SqlServerRole/MSFT_SqlServerRole.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.psm1 b/DSCResources/MSFT_SqlServiceAccount/MSFT_SqlServiceAccount.psm1 similarity index 99% rename from DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.psm1 rename to DSCResources/MSFT_SqlServiceAccount/MSFT_SqlServiceAccount.psm1 index 76b247cc3..0b3f90b90 100644 --- a/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.psm1 +++ b/DSCResources/MSFT_SqlServiceAccount/MSFT_SqlServiceAccount.psm1 @@ -1,10 +1,10 @@ Import-Module -Name (Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') + -ChildPath 'SqlServerDscHelper.psm1') Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` -ChildPath 'CommonResourceHelper.psm1') -$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlServerServiceAccount' +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlServiceAccount' <# .SYNOPSIS diff --git a/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.schema.mof b/DSCResources/MSFT_SqlServiceAccount/MSFT_SqlServiceAccount.schema.mof similarity index 88% rename from DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.schema.mof rename to DSCResources/MSFT_SqlServiceAccount/MSFT_SqlServiceAccount.schema.mof index 5b96929c8..bc99cacc8 100644 --- a/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.schema.mof +++ b/DSCResources/MSFT_SqlServiceAccount/MSFT_SqlServiceAccount.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("SqlServerServiceAccount")] -class MSFT_SqlServerServiceAccount : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlServiceAccount")] +class MSFT_SqlServiceAccount : OMI_BaseResource { [Key, Description("Hostname of the SQL Server.")] String SQLServer; [Key, Description("Name of the SQL instance.")] String SQLInstanceName; diff --git a/DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_SqlServerServiceAccount.strings.psd1 b/DSCResources/MSFT_SqlServiceAccount/en-US/MSFT_SqlServiceAccount.strings.psd1 similarity index 92% rename from DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_SqlServerServiceAccount.strings.psd1 rename to DSCResources/MSFT_SqlServiceAccount/en-US/MSFT_SqlServiceAccount.strings.psd1 index e0b1330df..f7929ba27 100644 --- a/DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_SqlServerServiceAccount.strings.psd1 +++ b/DSCResources/MSFT_SqlServiceAccount/en-US/MSFT_SqlServiceAccount.strings.psd1 @@ -1,4 +1,4 @@ -# Localized resources for SqlServerServiceAccount +# Localized resources for SqlServiceAccount ConvertFrom-StringData @' ForceServiceAccountUpdate = Force specified, skipping tests. With this configuration, Test-TargetResource will always return 'False'. diff --git a/DSCResources/MSFT_SqlSetup/MSFT_SqlSetup.psm1 b/DSCResources/MSFT_SqlSetup/MSFT_SqlSetup.psm1 index 8cc9c1260..6685b9c03 100644 --- a/DSCResources/MSFT_SqlSetup/MSFT_SqlSetup.psm1 +++ b/DSCResources/MSFT_SqlSetup/MSFT_SqlSetup.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') + -ChildPath 'SqlServerDscHelper.psm1') Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` -ChildPath 'CommonResourceHelper.psm1') diff --git a/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.psm1 b/DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.psm1 similarity index 99% rename from DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.psm1 rename to DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.psm1 index c369d1aa1..253dd405e 100644 --- a/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.psm1 +++ b/DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# diff --git a/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.schema.mof b/DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.schema.mof similarity index 84% rename from DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.schema.mof rename to DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.schema.mof index a848cabba..c576243da 100644 --- a/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.schema.mof +++ b/DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("SqlWaitForAvailabilityGroup")] -class MSFT_SqlWaitForAvailabilityGroup : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("MSFT_SqlWaitForAG")] +class MSFT_SqlWaitForAG : OMI_BaseResource { [Key, Description("Name of the cluster role/group to look for (normally the same as the Availability Group name).")] String Name; [Write, Description("The interval, in seconds, to check for the presence of the cluster role/group. Default value is 20 seconds. When the cluster role/group has been found the resource will wait for this amount of time once more before returning.")] Uint64 RetryIntervalSec; diff --git a/DSCResources/MSFT_SqlWindowsFirewall/MSFT_SqlWindowsFirewall.psm1 b/DSCResources/MSFT_SqlWindowsFirewall/MSFT_SqlWindowsFirewall.psm1 index 61e804d05..bdd0037a3 100644 --- a/DSCResources/MSFT_SqlWindowsFirewall/MSFT_SqlWindowsFirewall.psm1 +++ b/DSCResources/MSFT_SqlWindowsFirewall/MSFT_SqlWindowsFirewall.psm1 @@ -1,5 +1,5 @@ $script:currentPath = Split-Path -Path $MyInvocation.MyCommand.Path -Parent -Import-Module -Name (Join-Path -Path (Split-Path -Path (Split-Path -Path $script:currentPath -Parent) -Parent) -ChildPath 'SqlServerDSCHelper.psm1') +Import-Module -Name (Join-Path -Path (Split-Path -Path (Split-Path -Path $script:currentPath -Parent) -Parent) -ChildPath 'SqlServerDscHelper.psm1') <# .SYNOPSIS diff --git a/Examples/Resources/SqlAlias/1-AddSqlAlias.ps1 b/Examples/Resources/SqlAlias/1-AddSqlAlias.ps1 index f92417fb8..f60b68573 100644 --- a/Examples/Resources/SqlAlias/1-AddSqlAlias.ps1 +++ b/Examples/Resources/SqlAlias/1-AddSqlAlias.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc node localhost { SqlAlias Add_SqlAlias_TCP diff --git a/Examples/Resources/SqlAlias/2-RemoveSqlAlias.ps1 b/Examples/Resources/SqlAlias/2-RemoveSqlAlias.ps1 index 3a7b4d95d..6ee659605 100644 --- a/Examples/Resources/SqlAlias/2-RemoveSqlAlias.ps1 +++ b/Examples/Resources/SqlAlias/2-RemoveSqlAlias.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc node localhost { SqlAlias Remove_SqlAlias_TCP diff --git a/Examples/Resources/SqlScript/1-RunScriptUsingSQLAuthentication.ps1 b/Examples/Resources/SqlScript/1-RunScriptUsingSQLAuthentication.ps1 index e88a04a08..ff0458a1a 100644 --- a/Examples/Resources/SqlScript/1-RunScriptUsingSQLAuthentication.ps1 +++ b/Examples/Resources/SqlScript/1-RunScriptUsingSQLAuthentication.ps1 @@ -11,7 +11,7 @@ Configuration Example $SqlCredential ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc Node localhost { diff --git a/Examples/Resources/SqlScript/2-RunScriptUsingWindowsAuthentication.ps1 b/Examples/Resources/SqlScript/2-RunScriptUsingWindowsAuthentication.ps1 index 5eca83fdf..dcb5f6cfb 100644 --- a/Examples/Resources/SqlScript/2-RunScriptUsingWindowsAuthentication.ps1 +++ b/Examples/Resources/SqlScript/2-RunScriptUsingWindowsAuthentication.ps1 @@ -12,7 +12,7 @@ Configuration Example $WindowsCredential ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc Node localhost { diff --git a/Examples/Resources/SqlServerEndpoint/1-CreateEndpointWithDefaultValues.ps1 b/Examples/Resources/SqlServerEndpoint/1-CreateEndpointWithDefaultValues.ps1 index ca3a5ad25..4968a1474 100644 --- a/Examples/Resources/SqlServerEndpoint/1-CreateEndpointWithDefaultValues.ps1 +++ b/Examples/Resources/SqlServerEndpoint/1-CreateEndpointWithDefaultValues.ps1 @@ -13,7 +13,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerEndpoint/2-CreateEndpointWithSpecificPortAndIPAddress.ps1 b/Examples/Resources/SqlServerEndpoint/2-CreateEndpointWithSpecificPortAndIPAddress.ps1 index bbc5d5c6f..2a7dac754 100644 --- a/Examples/Resources/SqlServerEndpoint/2-CreateEndpointWithSpecificPortAndIPAddress.ps1 +++ b/Examples/Resources/SqlServerEndpoint/2-CreateEndpointWithSpecificPortAndIPAddress.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerEndpoint/3-RemoveEndpoint.ps1 b/Examples/Resources/SqlServerEndpoint/3-RemoveEndpoint.ps1 index 088e2905f..5d280483e 100644 --- a/Examples/Resources/SqlServerEndpoint/3-RemoveEndpoint.ps1 +++ b/Examples/Resources/SqlServerEndpoint/3-RemoveEndpoint.ps1 @@ -13,7 +13,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerEndpointPermission/1-AddConnectPermission.ps1 b/Examples/Resources/SqlServerEndpointPermission/1-AddConnectPermission.ps1 index b7a3efa51..7111808bd 100644 --- a/Examples/Resources/SqlServerEndpointPermission/1-AddConnectPermission.ps1 +++ b/Examples/Resources/SqlServerEndpointPermission/1-AddConnectPermission.ps1 @@ -18,7 +18,7 @@ Configuration Example $SqlServiceCredential ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerEndpointPermission/2-RemoveConnectPermission.ps1 b/Examples/Resources/SqlServerEndpointPermission/2-RemoveConnectPermission.ps1 index 7d27b2052..b28400ebe 100644 --- a/Examples/Resources/SqlServerEndpointPermission/2-RemoveConnectPermission.ps1 +++ b/Examples/Resources/SqlServerEndpointPermission/2-RemoveConnectPermission.ps1 @@ -18,7 +18,7 @@ Configuration Example $SqlServiceCredential ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerEndpointPermission/3-AddConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 b/Examples/Resources/SqlServerEndpointPermission/3-AddConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 index 5f7885a21..23e1ea040 100644 --- a/Examples/Resources/SqlServerEndpointPermission/3-AddConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 +++ b/Examples/Resources/SqlServerEndpointPermission/3-AddConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 @@ -43,7 +43,7 @@ Configuration Example $SqlServiceNode2Credential ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc node $AllNodes.Where{$_.Role -eq 'PrimaryReplica' }.NodeName { diff --git a/Examples/Resources/SqlServerEndpointPermission/4-RemoveConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 b/Examples/Resources/SqlServerEndpointPermission/4-RemoveConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 index 9aff5df62..56288f775 100644 --- a/Examples/Resources/SqlServerEndpointPermission/4-RemoveConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 +++ b/Examples/Resources/SqlServerEndpointPermission/4-RemoveConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 @@ -43,7 +43,7 @@ Configuration Example $SqlServiceNode2Credential ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc node $AllNodes.Where{$_.Role -eq 'PrimaryReplica' }.NodeName { diff --git a/Examples/Resources/SqlServerEndpointState/1-MakeSureEndpointIsStarted.ps1 b/Examples/Resources/SqlServerEndpointState/1-MakeSureEndpointIsStarted.ps1 index 65f7e08a7..4a7e154a1 100644 --- a/Examples/Resources/SqlServerEndpointState/1-MakeSureEndpointIsStarted.ps1 +++ b/Examples/Resources/SqlServerEndpointState/1-MakeSureEndpointIsStarted.ps1 @@ -21,7 +21,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerEndpointState/2-MakeSureEndpointIsStopped.ps1 b/Examples/Resources/SqlServerEndpointState/2-MakeSureEndpointIsStopped.ps1 index c53398403..0fd1dac00 100644 --- a/Examples/Resources/SqlServerEndpointState/2-MakeSureEndpointIsStopped.ps1 +++ b/Examples/Resources/SqlServerEndpointState/2-MakeSureEndpointIsStopped.ps1 @@ -12,7 +12,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName SqlServerDSC + Import-DscResource -ModuleName SqlServerDsc node localhost { diff --git a/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 b/Examples/Resources/SqlServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 similarity index 100% rename from Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 rename to Examples/Resources/SqlServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 diff --git a/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 b/Examples/Resources/SqlServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 similarity index 100% rename from Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 rename to Examples/Resources/SqlServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 diff --git a/README.md b/README.md index ae2fc2a21..8ab5dd531 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ questions or comments. ### master [![Build status](https://ci.appveyor.com/api/projects/status/mxn453y284eab8li/branch/master?svg=true)](https://ci.appveyor.com/project/PowerShell/xsqlserver/branch/master) -[![codecov](https://codecov.io/gh/PowerShell/xSQLServer/branch/master/graph/badge.svg)](https://codecov.io/gh/PowerShell/xSQLServer/branch/master) +[![codecov](https://codecov.io/gh/PowerShell/SqlServerDsc/branch/master/graph/badge.svg)](https://codecov.io/gh/PowerShell/SqlServerDsc/branch/master) This is the branch containing the latest release - no contributions should be made directly to this branch. @@ -21,7 +21,7 @@ no contributions should be made directly to this branch. ### dev [![Build status](https://ci.appveyor.com/api/projects/status/mxn453y284eab8li/branch/dev?svg=true)](https://ci.appveyor.com/project/PowerShell/xsqlserver/branch/dev) -[![codecov](https://codecov.io/gh/PowerShell/xSQLServer/branch/dev/graph/badge.svg)](https://codecov.io/gh/PowerShell/xSQLServer/branch/dev) +[![codecov](https://codecov.io/gh/PowerShell/SqlServerDsc/branch/dev/graph/badge.svg)](https://codecov.io/gh/PowerShell/SqlServerDsc/branch/dev) This is the development branch to which contributions should be proposed by contributors as pull requests. @@ -43,19 +43,19 @@ or even create new resources, by sending in pull requests yourself. * If you want to submit an issue or take part in discussions, - please browse the list of [issues](https://github.com/PowerShell/xSQLServer/issues). + please browse the list of [issues](https://github.com/PowerShell/SqlServerDsc/issues). Please check out [Contributing to the DSC Resource Kit](https://github.com/PowerShell/DscResources/blob/master/CONTRIBUTING.md) on how to work with issues. * If you want to review pull requests, please first check out the [Review Pull Request guidelines](https://github.com/PowerShell/DscResources/blob/master/CONTRIBUTING.md#reviewing-pull-requests), - and the browse the list of [pull requests](https://github.com/PowerShell/xSQLServer/pulls) + and the browse the list of [pull requests](https://github.com/PowerShell/SqlServerDsc/pulls) and look for those pull requests with label 'needs review'. * If you want to improve the resources or tests, or create a new resource, then please check out the following guidelines. * The [Contributing to the DSC Resource Kit](https://github.com/PowerShell/DscResources/blob/master/CONTRIBUTING.md) guidelines. - * The specific [Contributing to xSQLServer](https://github.com/PowerShell/xSQLServer/blob/dev/CONTRIBUTING.md) + * The specific [Contributing to SqlServerDsc](https://github.com/PowerShell/SqlServerDsc/blob/dev/CONTRIBUTING.md) guidelines. * The common [Style Guidelines](https://github.com/PowerShell/DscResources/blob/master/StyleGuidelines.md). * The common [Best Practices](https://github.com/PowerShell/DscResources/blob/master/BestPractices.md) @@ -130,7 +130,7 @@ A full list of changes in each version can be found in the [change log](CHANGELO database owners. * [**SqlDatabasePermission**](#sqldatabasepermission) resource to manage SQL database permissions. -* [**SqlDatabaseRecoveryModel**](#sqlserverrecoverymodel) resource +* [**SqlDatabaseRecoveryModel**](#sqldatabaserecoverymodel) resource to manage database recovery model. * [**SqlDatabaseRole**](#sqldatabaserole) resource to manage SQL database roles. @@ -158,10 +158,10 @@ A full list of changes in each version can be found in the [change log](CHANGELO the secure connection level for SQL Server Reporting Services. * [**SqlScript**](#sqlscript) resource to extend DSC Get/Set/Test functionality to T-SQL. -* [**SqlServerServiceAccount**](#sqlserverserviceaccount) Manage the service account +* [**SqlServiceAccount**](#sqlserviceaccount) Manage the service account for SQL Server services. * [**SqlSetup**](#sqlsetup) installs a standalone SQL Server instance. -* [**SqlWaitForAvailabilityGroup**](#sqlwaitforavailabilitygroup) resource to +* [**SqlWaitForAG**](#sqlwaitforag) resource to wait until availability group is created on primary server. ### SqlAlias @@ -1275,7 +1275,7 @@ The Set T-SQL script performs the actual change when Test T-SQL script fails. PowerShell module. _Note: There is a known problem running this resource using PowerShell 4.0. -See [issue #273](https://github.com/PowerShell/xSQLServer/issues/273) for more information._ +See [issue #273](https://github.com/PowerShell/SqlServerDsc/issues/273) for more information._ #### Parameters @@ -1316,7 +1316,7 @@ See [issue #273](https://github.com/PowerShell/xSQLServer/issues/273) for more i * [Run a script using SQL Authentication](/Examples/Resources/SqlScript/1-RunScriptUsingSQLAuthentication.ps1) * [Run a script using Windows Authentication](/Examples/Resources/SqlScript/2-RunScriptUsingWindowsAuthentication.ps1) -### SqlServerServiceAccount +### SqlServiceAccount Manage the service account for SQL Server services. @@ -1343,8 +1343,8 @@ Manage the service account for SQL Server services. #### Examples -* [Run service under a user account](/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1) -* [Run service with a virtual account](/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1) +* [Run service under a user account](/Examples/Resources/SqlServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1) +* [Run service with a virtual account](/Examples/Resources/SqlServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1) ### SqlSetup @@ -1498,7 +1498,7 @@ installing feature Database Engine and Analysis Services respectively. #### Known issues -All issues are not listed here, see [here for all open issues](https://github.com/PowerShell/xSQLServer/issues?q=is%3Aissue%20is%3Aopen%20SqlSetup). +All issues are not listed here, see [here for all open issues](https://github.com/PowerShell/SqlServerDsc/issues?q=is%3Aissue%20is%3Aopen%20SqlSetup). ##### Severe known issues @@ -1506,7 +1506,7 @@ This is a list of known issues that severely impact the use of the resource. There are currently no known severe issues. -### SqlWaitForAvailabilityGroup +### SqlWaitForAG This resource will wait for a cluster role/group to be created. This is used to wait for an Availability Group to create the cluster role/group in the cluster. @@ -1545,5 +1545,5 @@ or that it has finished creating the Availability Group. #### Examples -* [Wait for a cluster role/group to be available](/Examples/Resources/SqlWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1) -* [Wait for multiple cluster roles/groups to be available](/Examples/Resources/SqlWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1) +* [Wait for a cluster role/group to be available](/Examples/Resources/SqlWaitForAG/1-WaitForASingleClusterGroup.ps1) +* [Wait for multiple cluster roles/groups to be available](/Examples/Resources/SqlWaitForAG/2-WaitForMultipleClusterGroups.ps1) diff --git a/SQLServerDSC.psd1 b/SQLServerDSC.psd1 index 53c0f0e7a..0164f2fd5 100644 --- a/SQLServerDSC.psd1 +++ b/SQLServerDSC.psd1 @@ -1,6 +1,6 @@ @{ # Version number of this module. -ModuleVersion = '9.0.0.0' +ModuleVersion = '8.2.0.0' # ID used to uniquely identify this module GUID = '74e9ddb5-4cbc-4fa2-a222-2bcfb533fd66' diff --git a/SqlServerDSCHelper.psm1 b/SqlServerDSCHelper.psm1 index 819166cf4..ff3da136d 100644 --- a/SqlServerDSCHelper.psm1 +++ b/SqlServerDSCHelper.psm1 @@ -3,7 +3,7 @@ Import-Module -Name (Join-Path -Path (Join-Path -Path $PSScriptRoot ` -ChildPath 'DscResources') ` -ChildPath 'CommonResourceHelper.psm1') -$script:localizedData = Get-LocalizedData -ResourceName 'SqlServerDSCHelper' -ScriptRoot $PSScriptRoot +$script:localizedData = Get-LocalizedData -ResourceName 'SqlServerDscHelper' -ScriptRoot $PSScriptRoot <# .SYNOPSIS diff --git a/en-US/SqlServerDSCHelper.strings.psd1 b/en-US/SqlServerDSCHelper.strings.psd1 index 08fed202c..ab81b005b 100644 --- a/en-US/SqlServerDSCHelper.strings.psd1 +++ b/en-US/SqlServerDSCHelper.strings.psd1 @@ -1,4 +1,4 @@ -# Localized resources for helper module SqlServerDSCHelper. +# Localized resources for helper module SqlServerDscHelper. ConvertFrom-StringData @' ConnectedToDatabaseEngineInstance = Connected to SQL instance '{0}'. @@ -17,7 +17,7 @@ ConvertFrom-StringData @' PropertiesDoesNotMatch = Found an array for property {0} in the current values, but this array does not match the desired state. Details of the changes are below. PropertyThatDoesNotMatch = {0} - {1} ValueOfTypeDoesNotMatch = {0} value for property {1} does not match. Current state is '{2}' and desired state is '{3}'. - UnableToCompareProperty = Unable to compare property {0} as the type {1} is not handled by the Test-SQLDscParameterState cmdlet. + UnableToCompareProperty = Unable to compare property {0} as the type {1} is not handled by the Test-SQLDSCParameterState cmdlet. PreferredModuleFound = Preferred module SqlServer found. PreferredModuleNotFound = Information: PowerShell module SqlServer not found, trying to use older SQLPS module. ImportingPowerShellModule = Importing PowerShell module {0}. From b2043a7f50e9782a89023b45f4dfadbe59b69215 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 9 Nov 2017 11:45:14 -0600 Subject: [PATCH 14/42] Rename SqlServerDSCHelper.psm1 to SqlServerDscHelper.psm1 --- SqlServerDSCHelper.psm1 => SqlServerDscHelper.psm1 | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename SqlServerDSCHelper.psm1 => SqlServerDscHelper.psm1 (100%) diff --git a/SqlServerDSCHelper.psm1 b/SqlServerDscHelper.psm1 similarity index 100% rename from SqlServerDSCHelper.psm1 rename to SqlServerDscHelper.psm1 From 25f480bf0102a9c9f98463d46e09e23f8ed65d6a Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 9 Nov 2017 11:46:17 -0600 Subject: [PATCH 15/42] Rename SQLServerDSC.psd1 to SQLServerDsc.psd1 --- SQLServerDSC.psd1 => SQLServerDsc.psd1 | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename SQLServerDSC.psd1 => SQLServerDsc.psd1 (100%) diff --git a/SQLServerDSC.psd1 b/SQLServerDsc.psd1 similarity index 100% rename from SQLServerDSC.psd1 rename to SQLServerDsc.psd1 From aaf868d98679874b78b57ef64667541b9d9279a3 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 9 Nov 2017 11:46:38 -0600 Subject: [PATCH 16/42] Rename SqlServerDSCHelper.strings.psd1 to SqlServerDscHelper.strings.psd1 --- ...rverDSCHelper.strings.psd1 => SqlServerDscHelper.strings.psd1} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sv-SE/{SqlServerDSCHelper.strings.psd1 => SqlServerDscHelper.strings.psd1} (100%) diff --git a/sv-SE/SqlServerDSCHelper.strings.psd1 b/sv-SE/SqlServerDscHelper.strings.psd1 similarity index 100% rename from sv-SE/SqlServerDSCHelper.strings.psd1 rename to sv-SE/SqlServerDscHelper.strings.psd1 From 9f1360519ae4592415e34ced0417d77096a92eb6 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 9 Nov 2017 11:46:57 -0600 Subject: [PATCH 17/42] Rename SqlServerDSCHelper.strings.psd1 to SqlServerDscHelper.strings.psd1 --- ...rverDSCHelper.strings.psd1 => SqlServerDscHelper.strings.psd1} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename en-US/{SqlServerDSCHelper.strings.psd1 => SqlServerDscHelper.strings.psd1} (100%) diff --git a/en-US/SqlServerDSCHelper.strings.psd1 b/en-US/SqlServerDscHelper.strings.psd1 similarity index 100% rename from en-US/SqlServerDSCHelper.strings.psd1 rename to en-US/SqlServerDscHelper.strings.psd1 From f415f70370c339051d08511a5333d59315101355 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 9 Nov 2017 11:47:15 -0600 Subject: [PATCH 18/42] Rename SqlServerDSCCommon.Tests.ps1 to SqlServerDscCommon.Tests.ps1 --- ...{SqlServerDSCCommon.Tests.ps1 => SqlServerDscCommon.Tests.ps1} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Tests/{SqlServerDSCCommon.Tests.ps1 => SqlServerDscCommon.Tests.ps1} (100%) diff --git a/Tests/SqlServerDSCCommon.Tests.ps1 b/Tests/SqlServerDscCommon.Tests.ps1 similarity index 100% rename from Tests/SqlServerDSCCommon.Tests.ps1 rename to Tests/SqlServerDscCommon.Tests.ps1 From 59692a1f61b5780b0fdc9796094742b5efea063a Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 9 Nov 2017 14:37:32 -0600 Subject: [PATCH 19/42] correct build errors --- Examples/DSCClusterSqlBuild.ps1 | 8 ++++---- Examples/DSCFCISqlBuild.ps1 | 2 +- Examples/DSCSQLBuildEncrypted.ps1 | 2 +- Examples/DSCSqlBuild.ps1 | 2 +- .../1-ConfigureServiceAccount-UserAccount.ps1 | 2 +- .../2-ConfigureServiceAccount-VirtualAccount.ps1 | 2 +- .../SqlWaitForAG/1-WaitForASingleClusterGroup.ps1 | 2 +- Examples/SQL-ClusterDB.ps1 | 2 +- Examples/SQL-Standalone.ps1 | 2 +- Examples/SQLPush_SingleServer.ps1 | 2 +- README.md | 3 ++- Tests/Unit/MSFT_SqlWaitForAG.Tests.ps1 | 6 +++--- 12 files changed, 18 insertions(+), 17 deletions(-) diff --git a/Examples/DSCClusterSqlBuild.ps1 b/Examples/DSCClusterSqlBuild.ps1 index 4bb8abc1a..df5753b5c 100644 --- a/Examples/DSCClusterSqlBuild.ps1 +++ b/Examples/DSCClusterSqlBuild.ps1 @@ -88,7 +88,7 @@ Configuration AlwaysOnCluster DependsOn = '[WindowsFeature]NET' } - xSqlServerFirewall ($Node.NodeName) + SqlWindowsFirewall ($Node.NodeName) { SourcePath = $Node.SourcePath InstanceName = $Node.InstanceName @@ -224,7 +224,7 @@ Configuration AlwaysOnCluster DependsOn = '[WindowsFeature]NET' } - xSqlServerFirewall ($Node.NodeName) + SqlWindowsFirewall ($Node.NodeName) { SourcePath = $Node.SourcePath InstanceName = $Node.InstanceName @@ -314,7 +314,7 @@ Configuration AlwaysOnCluster DependsOn = ("[xSqlServerSetup]" + $Node.NodeName) } - SqlWaitForAvailabilityGroup waitforAG + SqlWaitForAG waitforAG { Name = "MyAG" RetryIntervalSec = 20 @@ -330,7 +330,7 @@ Configuration AlwaysOnCluster SetupCredential = $Node.InstallerServiceAccount PsDscRunAsCredential = $Node.InstallerServiceAccount - DependsOn = ("[SqlWaitForAvailabilityGroup]waitforAG") + DependsOn = ("[SqlWaitForAG]waitforAG") } } diff --git a/Examples/DSCFCISqlBuild.ps1 b/Examples/DSCFCISqlBuild.ps1 index 638378b5d..03cb6b73b 100644 --- a/Examples/DSCFCISqlBuild.ps1 +++ b/Examples/DSCFCISqlBuild.ps1 @@ -64,7 +64,7 @@ Configuration FCISQL SQLSvcAccount = $Node.InstallerServiceAccount } - xSqlServerFirewall "FirewallMSSQLSERVER" + SqlWindowsFirewall "FirewallMSSQLSERVER" { DependsOn = "[xSQLServerFailoverClusterSetup]PrepareMSSQLSERVER" SourcePath = $Node.SourcePath diff --git a/Examples/DSCSQLBuildEncrypted.ps1 b/Examples/DSCSQLBuildEncrypted.ps1 index 62dd732e8..343b1e564 100644 --- a/Examples/DSCSQLBuildEncrypted.ps1 +++ b/Examples/DSCSQLBuildEncrypted.ps1 @@ -106,7 +106,7 @@ Configuration SQLBuild SQLTempDBLogDir = "L:\MSSQL\Data" SQLBackupDir = "G:\MSSQL\Backup" } - xSqlServerFirewall ($Node.NodeName) + SqlWindowsFirewall ($Node.NodeName) { SourcePath = $Node.SourcePath InstanceName = $Node.InstanceName diff --git a/Examples/DSCSqlBuild.ps1 b/Examples/DSCSqlBuild.ps1 index f854c2d23..e90e07974 100644 --- a/Examples/DSCSqlBuild.ps1 +++ b/Examples/DSCSqlBuild.ps1 @@ -88,7 +88,7 @@ Configuration SQLBuild DependsOn = '[WindowsFeature]NET' } - xSqlServerFirewall ($Node.NodeName) + SqlWindowsFirewall ($Node.NodeName) { SourcePath = $Node.SourcePath InstanceName = $Node.InstanceName diff --git a/Examples/Resources/SqlServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 b/Examples/Resources/SqlServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 index 72273ff5a..5d92cced8 100644 --- a/Examples/Resources/SqlServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 +++ b/Examples/Resources/SqlServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 @@ -15,7 +15,7 @@ Configuration Example Import-DscResource -ModuleName SqlServerDsc Node localhost { - SqlServerServiceAccount SetServiceAcccount_User + SqlServiceAccount SetServiceAcccount_User { SQLServer = 'TestServer' SQLInstanceName = 'MSSQLSERVER' diff --git a/Examples/Resources/SqlServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 b/Examples/Resources/SqlServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 index 21b7227f1..6a67ed0a7 100644 --- a/Examples/Resources/SqlServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 +++ b/Examples/Resources/SqlServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 @@ -18,7 +18,7 @@ Configuration Example Import-DscResource -ModuleName SqlServerDsc Node localhost { - SqlServerServiceAccount SetServiceAcccount_User + SqlServiceAccount SetServiceAcccount_User { SQLServer = 'TestServer' SQLInstanceName = 'DSC' diff --git a/Examples/Resources/SqlWaitForAG/1-WaitForASingleClusterGroup.ps1 b/Examples/Resources/SqlWaitForAG/1-WaitForASingleClusterGroup.ps1 index f78de9b44..d1566a51e 100644 --- a/Examples/Resources/SqlWaitForAG/1-WaitForASingleClusterGroup.ps1 +++ b/Examples/Resources/SqlWaitForAG/1-WaitForASingleClusterGroup.ps1 @@ -16,7 +16,7 @@ Configuration Example node localhost { - SqlWaitForAvailabilityGroup SQLConfigureAG-WaitAGTest1 + SqlWaitForAG SQLConfigureAG-WaitAGTest1 { Name = 'AGTest1' RetryIntervalSec = 20 diff --git a/Examples/SQL-ClusterDB.ps1 b/Examples/SQL-ClusterDB.ps1 index 137afcefb..8d7ae0da8 100644 --- a/Examples/SQL-ClusterDB.ps1 +++ b/Examples/SQL-ClusterDB.ps1 @@ -104,7 +104,7 @@ Configuration SQL SQLSvcAccount = $Node.SQLServiceAccount } - xSqlServerFirewall "FirewallMSSQLSERVER" + SqlWindowsFirewall "FirewallMSSQLSERVER" { DependsOn = "[xSQLServerFailoverClusterSetup]PrepareMSSQLSERVER" SourcePath = $Node.SourcePath diff --git a/Examples/SQL-Standalone.ps1 b/Examples/SQL-Standalone.ps1 index 1bc4498bc..2574773ea 100644 --- a/Examples/SQL-Standalone.ps1 +++ b/Examples/SQL-Standalone.ps1 @@ -79,7 +79,7 @@ Configuration SQLSA ASConfigDir = "O:\Program Files\Microsoft SQL Server\MSAS11.MSSQLSERVER\OLAP\Config" } - xSqlServerFirewall ($Node.NodeName + $SQLInstanceName) + SqlWindowsFirewall ($Node.NodeName + $SQLInstanceName) { DependsOn = ("[xSqlServerSetup]" + $Node.NodeName + $SQLInstanceName) SourcePath = $Node.SourcePath diff --git a/Examples/SQLPush_SingleServer.ps1 b/Examples/SQLPush_SingleServer.ps1 index c615061e1..1d577a27a 100644 --- a/Examples/SQLPush_SingleServer.ps1 +++ b/Examples/SQLPush_SingleServer.ps1 @@ -71,7 +71,7 @@ Configuration SQLSA SQLBackupDir = "G:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Data" } - xSqlServerFirewall ($Node.NodeName) + SqlWindowsFirewall ($Node.NodeName) { DependsOn = ("[xSqlServerSetup]" + $Node.NodeName) SourcePath = $Node.SourcePath diff --git a/README.md b/README.md index 8ab5dd531..18b9e2a36 100644 --- a/README.md +++ b/README.md @@ -1275,7 +1275,8 @@ The Set T-SQL script performs the actual change when Test T-SQL script fails. PowerShell module. _Note: There is a known problem running this resource using PowerShell 4.0. -See [issue #273](https://github.com/PowerShell/SqlServerDsc/issues/273) for more information._ +See [issue #273](https://github.com/PowerShell/SqlServerDsc/issues/273) +for more information._ #### Parameters diff --git a/Tests/Unit/MSFT_SqlWaitForAG.Tests.ps1 b/Tests/Unit/MSFT_SqlWaitForAG.Tests.ps1 index 8b21a4e3c..226dd6a65 100644 --- a/Tests/Unit/MSFT_SqlWaitForAG.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlWaitForAG.Tests.ps1 @@ -78,7 +78,7 @@ try RetryCount = $mockRetryCount } - Describe 'MSFT_SqlWaitForAvailabilityGroup\Get-TargetResource' -Tag 'Get' { + Describe 'MSFT_SqlWaitForAG\Get-TargetResource' -Tag 'Get' { BeforeEach { $testParameters = $mockDefaultParameters.Clone() @@ -142,7 +142,7 @@ try } - Describe 'MSFT_SqlWaitForAvailabilityGroup\Test-TargetResource' -Tag 'Test'{ + Describe 'MSFT_SqlWaitForAG\Test-TargetResource' -Tag 'Test'{ BeforeEach { $testParameters = $mockDefaultParameters.Clone() @@ -191,7 +191,7 @@ try Assert-VerifiableMock } - Describe 'MSFT_SqlWaitForAvailabilityGroup\Set-TargetResource' -Tag 'Set'{ + Describe 'MSFT_SqlWaitForAG\Set-TargetResource' -Tag 'Set'{ BeforeEach { $testParameters = $mockDefaultParameters.Clone() From 50112a3b99a39a9c1f537dccd73954ac65569011 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 9 Nov 2017 15:25:48 -0600 Subject: [PATCH 20/42] naming example in code block rather than inline --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fdd506837..d377c2e33 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -34,7 +34,9 @@ Those SQL Server products that are still supported can be listed at the ### Naming convention +```naming [][]{ | } +``` #### mof-based resource From cbfa6d937e90221ae1aee52f98c87864ac06e01e Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 9 Nov 2017 15:34:40 -0600 Subject: [PATCH 21/42] error in waitforag schema file --- DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.schema.mof | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.schema.mof b/DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.schema.mof index c576243da..759e43071 100644 --- a/DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.schema.mof +++ b/DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.schema.mof @@ -1,4 +1,4 @@ -[ClassVersion("1.0.0.0"), FriendlyName("MSFT_SqlWaitForAG")] +[ClassVersion("1.0.0.0"), FriendlyName("SqlWaitForAG")] class MSFT_SqlWaitForAG : OMI_BaseResource { [Key, Description("Name of the cluster role/group to look for (normally the same as the Availability Group name).")] String Name; From 678e2a2a0b0f88e60368e2df25a9686a6d920128 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Mon, 13 Nov 2017 06:28:29 -0600 Subject: [PATCH 22/42] Rename SQLAGDatabases to singular based on Issue 851 discussion --- CHANGELOG.md | 2 +- .../MSFT_SqlAGDatabase.psm1} | 2 +- .../MSFT_SqlAGDatabase.schema.mof} | 4 ++-- .../en-US/MSFT_SqlAGDatabase.strings.psd1} | 2 +- .../en-US/about_SqlAGDatabase.help.txt} | 0 .../1-AddDatabaseToAvailabilityGroup.ps1} | 2 +- .../2-RemoveDatabaseFromAvailabilityGroup.ps1} | 2 +- ...atchDefinedDatabaseInAvailabilityGroup.ps1} | 2 +- README.md | 4 ++-- ....Tests.ps1 => MSFT_SqlAGDatabase.Tests.ps1} | 18 +++++++++--------- Tests/Unit/Stubs/SMO.cs | 16 ++++++++-------- 11 files changed, 27 insertions(+), 27 deletions(-) rename DSCResources/{MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 => MSFT_SqlAGDatabase/MSFT_SqlAGDatabase.psm1} (99%) rename DSCResources/{MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.schema.mof => MSFT_SqlAGDatabase/MSFT_SqlAGDatabase.schema.mof} (95%) rename DSCResources/{MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 => MSFT_SqlAGDatabase/en-US/MSFT_SqlAGDatabase.strings.psd1} (96%) rename DSCResources/{MSFT_SqlAGDatabases/en-US/about_SqlAGDatabases.help.txt => MSFT_SqlAGDatabase/en-US/about_SqlAGDatabase.help.txt} (100%) rename Examples/Resources/{SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 => SqlAGDatabase/1-AddDatabaseToAvailabilityGroup.ps1} (98%) rename Examples/Resources/{SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 => SqlAGDatabase/2-RemoveDatabaseFromAvailabilityGroup.ps1} (98%) rename Examples/Resources/{SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 => SqlAGDatabase/3-MatchDefinedDatabaseInAvailabilityGroup.ps1} (98%) rename Tests/Unit/{MSFT_SqlAGDatabases.Tests.ps1 => MSFT_SqlAGDatabase.Tests.ps1} (99%) diff --git a/CHANGELOG.md b/CHANGELOG.md index df4579989..a3a2f2c25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,7 +30,7 @@ - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, the resource will only determine if a change is needed if the target node is the active host of the SQL Server instance ([issue #868](https://github.com/PowerShell/xSQLServer/issues/868)). -- Changes to SqlAGDatabases +- Changes to SqlAGDatabase - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, the resource will only determine if a change is needed if the target node is the active host of the SQL Server instance ([issue #869](https://github.com/PowerShell/xSQLServer/issues/869)). diff --git a/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 b/DSCResources/MSFT_SqlAGDatabase/MSFT_SqlAGDatabase.psm1 similarity index 99% rename from DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 rename to DSCResources/MSFT_SqlAGDatabase/MSFT_SqlAGDatabase.psm1 index 190211a82..85023b245 100644 --- a/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 +++ b/DSCResources/MSFT_SqlAGDatabase/MSFT_SqlAGDatabase.psm1 @@ -5,7 +5,7 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Pare Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` -ChildPath 'CommonResourceHelper.psm1') -$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlAGDatabases' +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlAGDatabase' <# .SYNOPSIS diff --git a/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.schema.mof b/DSCResources/MSFT_SqlAGDatabase/MSFT_SqlAGDatabase.schema.mof similarity index 95% rename from DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.schema.mof rename to DSCResources/MSFT_SqlAGDatabase/MSFT_SqlAGDatabase.schema.mof index 795e6c729..c22733e05 100644 --- a/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.schema.mof +++ b/DSCResources/MSFT_SqlAGDatabase/MSFT_SqlAGDatabase.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("SqlAGDatabases")] -class MSFT_SqlAGDatabases : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlAGDatabase")] +class MSFT_SqlAGDatabase : OMI_BaseResource { [Required, Description("The name of the database(s) to add to the availability group. This accepts wildcards.")] String DatabaseName[]; [Key, Description("Hostname of the SQL Server where the primary replica of the availability group lives. If the availability group is not currently on this server, the resource will attempt to connect to the server where the primary replica lives.")] String SQLServer; diff --git a/DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 b/DSCResources/MSFT_SqlAGDatabase/en-US/MSFT_SqlAGDatabase.strings.psd1 similarity index 96% rename from DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 rename to DSCResources/MSFT_SqlAGDatabase/en-US/MSFT_SqlAGDatabase.strings.psd1 index c8fd93ed7..112cf9e1e 100644 --- a/DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 +++ b/DSCResources/MSFT_SqlAGDatabase/en-US/MSFT_SqlAGDatabase.strings.psd1 @@ -1,4 +1,4 @@ -# Localized resources for SqlAGDatabases +# Localized resources for SqlAGDatabase ConvertFrom-StringData @' AddingDatabasesToAvailabilityGroup = Adding the following databases to the '{0}' availability group: {1}. diff --git a/DSCResources/MSFT_SqlAGDatabases/en-US/about_SqlAGDatabases.help.txt b/DSCResources/MSFT_SqlAGDatabase/en-US/about_SqlAGDatabase.help.txt similarity index 100% rename from DSCResources/MSFT_SqlAGDatabases/en-US/about_SqlAGDatabases.help.txt rename to DSCResources/MSFT_SqlAGDatabase/en-US/about_SqlAGDatabase.help.txt diff --git a/Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 b/Examples/Resources/SqlAGDatabase/1-AddDatabaseToAvailabilityGroup.ps1 similarity index 98% rename from Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 rename to Examples/Resources/SqlAGDatabase/1-AddDatabaseToAvailabilityGroup.ps1 index 683d631fd..d6f28b2e2 100644 --- a/Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 +++ b/Examples/Resources/SqlAGDatabase/1-AddDatabaseToAvailabilityGroup.ps1 @@ -104,7 +104,7 @@ Configuration Example if ( $Node.Role -eq 'PrimaryReplica' ) { - SqlAGDatabases 'TestAGDatabaseMemberships' + SqlAGDatabase 'TestAGDatabaseMemberships' { AvailabilityGroupName = $Node.AvailabilityGroupName BackupPath = '\\SQL1\AgInitialize' diff --git a/Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 b/Examples/Resources/SqlAGDatabase/2-RemoveDatabaseFromAvailabilityGroup.ps1 similarity index 98% rename from Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 rename to Examples/Resources/SqlAGDatabase/2-RemoveDatabaseFromAvailabilityGroup.ps1 index aebf3956e..2ef77e7e0 100644 --- a/Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 +++ b/Examples/Resources/SqlAGDatabase/2-RemoveDatabaseFromAvailabilityGroup.ps1 @@ -99,7 +99,7 @@ Configuration Example if ( $Node.Role -eq 'PrimaryReplica' ) { - SqlAGDatabases 'TestAGDatabaseMemberships' + SqlAGDatabase 'TestAGDatabaseMemberships' { AvailabilityGroupName = $Node.AvailabilityGroupName BackupPath = '\\SQL1\AgInitialize' diff --git a/Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 b/Examples/Resources/SqlAGDatabase/3-MatchDefinedDatabaseInAvailabilityGroup.ps1 similarity index 98% rename from Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 rename to Examples/Resources/SqlAGDatabase/3-MatchDefinedDatabaseInAvailabilityGroup.ps1 index 794b25fd2..7a79ad6a8 100644 --- a/Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 +++ b/Examples/Resources/SqlAGDatabase/3-MatchDefinedDatabaseInAvailabilityGroup.ps1 @@ -99,7 +99,7 @@ Configuration Example if ( $Node.Role -eq 'PrimaryReplica' ) { - SqlAGDatabases 'TestAGDatabaseMemberships' + SqlAGDatabase 'TestAGDatabaseMemberships' { AvailabilityGroupName = $Node.AvailabilityGroupName BackupPath = '\\SQL1\AgInitialize' diff --git a/README.md b/README.md index 18b9e2a36..1a7d3370a 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ A full list of changes in each version can be found in the [change log](CHANGELO * [**SqlAlias**](#sqlalias) resource to manage SQL Server client Aliases. * [**SqlAG**](#sqlag) resource to ensure an availability group is present or absent. -* [**SqlAGDatabases**](#sqlagdatabases) +* [**SqlAGDatabase**](#SqlAGDatabase) to manage the database membership in Availability Groups. * [**SqlAGReplica**](#sqlagreplica) resource to ensure an availability group replica is present or absent. @@ -275,7 +275,7 @@ It will also manage the Availability Group replica on the specified node. * [Add a SQL Server Always On Availability Group and explicitly defines its properties](/Examples/Resources/SqlAG/3-CreateAvailabilityGroupDetailed.ps1) * [Remove a SQL Server Always On Availability Group](/Examples/Resources/SqlAG/2-RemoveAvailabilityGroup.ps1) -### SqlAGDatabases +### SqlAGDatabase This resource is used to add and/or remove databases to a specified availability group. diff --git a/Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 b/Tests/Unit/MSFT_SqlAGDatabase.Tests.ps1 similarity index 99% rename from Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 rename to Tests/Unit/MSFT_SqlAGDatabase.Tests.ps1 index fdf324e13..ddb703f08 100644 --- a/Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAGDatabase.Tests.ps1 @@ -17,7 +17,7 @@ Add-Type -Path ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stub $TestEnvironment = Initialize-TestEnvironment ` -DSCModuleName 'SqlServerDsc' ` - -DSCResourceName 'MSFT_SqlAGDatabases' ` + -DSCResourceName 'MSFT_SqlAGDatabase' ` -TestType Unit #endregion HEADER @@ -37,7 +37,7 @@ try { Invoke-TestSetup - InModuleScope 'MSFT_SqlAGDatabases' { + InModuleScope 'MSFT_SqlAGDatabase' { #region Parameter Mocks @@ -354,7 +354,7 @@ WITH NORECOVERY' #endregion Invoke Query Mock - Describe 'SqlAGDatabases\Get-TargetResource' { + Describe 'SqlAGDatabase\Get-TargetResource' { BeforeAll { Mock -CommandName Connect-SQL -MockWith { return $mockServerObject } -Verifiable Mock -CommandName Import-SQLPSModule -MockWith {} -Verifiable @@ -422,7 +422,7 @@ WITH NORECOVERY' } } - Describe 'SqlAGDatabases\Set-TargetResource' { + Describe 'SqlAGDatabase\Set-TargetResource' { BeforeAll { Mock -CommandName Get-PrimaryReplicaServerObject -MockWith { return $mockServerObject } -Verifiable -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } Mock -CommandName Get-PrimaryReplicaServerObject -MockWith { return $mockServer2Object } -Verifiable -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } @@ -1137,7 +1137,7 @@ WITH NORECOVERY' } } - Describe 'SqlAGDatabases\Test-TargetResource' { + Describe 'SqlAGDatabase\Test-TargetResource' { BeforeAll { Mock -CommandName Connect-SQL -MockWith { return $mockServerObject } -Verifiable Mock -CommandName Get-PrimaryReplicaServerObject -MockWith { return $mockServerObject } -Verifiable -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } @@ -1331,7 +1331,7 @@ WITH NORECOVERY' } } - Describe 'SqlAGDatabases\Get-DatabasesToAddToAvailabilityGroup' { + Describe 'SqlAGDatabase\Get-DatabasesToAddToAvailabilityGroup' { BeforeEach { $getDatabasesToAddToAvailabilityGroup = @{ DatabaseName = $mockDatabaseNameParameter.Clone() @@ -1370,7 +1370,7 @@ WITH NORECOVERY' } } - Describe 'SqlAGDatabases\Get-DatabasesToRemoveFromAvailabilityGroup' { + Describe 'SqlAGDatabase\Get-DatabasesToRemoveFromAvailabilityGroup' { BeforeEach { $getDatabasesToRemoveFromAvailabilityGroupParameters = @{ DatabaseName = $mockDatabaseNameParameter.Clone() @@ -1447,7 +1447,7 @@ WITH NORECOVERY' } } - Describe 'SqlAGDatabases\Get-MatchingDatabaseNames' { + Describe 'SqlAGDatabase\Get-MatchingDatabaseNames' { BeforeEach { $getMatchingDatabaseNamesParameters = @{ DatabaseName = $mockDatabaseNameParameter.Clone() @@ -1479,7 +1479,7 @@ WITH NORECOVERY' } } - Describe 'SqlAGDatabases\Get-DatabaseNamesNotFoundOnTheInstance' { + Describe 'SqlAGDatabase\Get-DatabaseNamesNotFoundOnTheInstance' { Context 'When the Get-DatabaseNamesNotFoundOnTheInstance function is called' { BeforeAll { # The defined databases that should be identified as missing diff --git a/Tests/Unit/Stubs/SMO.cs b/Tests/Unit/Stubs/SMO.cs index 18b840277..9155fc29e 100644 --- a/Tests/Unit/Stubs/SMO.cs +++ b/Tests/Unit/Stubs/SMO.cs @@ -542,7 +542,7 @@ public ServerRole( Object server, string name ) { // TypeName: Microsoft.SqlServer.Management.Smo.Database // BaseType: Microsoft.SqlServer.Management.Smo.ScriptNameObjectBase // Used by: - // MSFT_SqlAGDatabases + // MSFT_SqlAGDatabase // MSFT_SqlDatabase // MSFT_SqlDatabasePermission public class Database @@ -782,7 +782,7 @@ public void Create() // TypeName: Microsoft.SqlServer.Management.Common.ServerConnection // Used by: - // SqlAGDatabases + // SqlAGDatabase public class ConnectionContext { public string TrueLogin; @@ -793,7 +793,7 @@ public void Create() // TypeName: Microsoft.SqlServer.Management.Smo.AvailabilityDatabase // Used by: - // SqlAGDatabases + // SqlAGDatabase public class AvailabilityDatabase { public string Name; @@ -803,7 +803,7 @@ public void Create() {} // TypeName: Microsoft.SqlServer.Management.Smo.DatabaseCollection // Used by: - // SqlAGDatabases + // SqlAGDatabase public class DatabaseCollection : Collection { public Database this[string name] @@ -825,7 +825,7 @@ public Database this[string name] // TypeName: Microsoft.SqlServer.Management.Smo.AvailabilityReplicaCollection // Used by: - // SqlAGDatabases + // SqlAGDatabase public class AvailabilityReplicaCollection : Collection { public AvailabilityReplica this[string name] @@ -847,7 +847,7 @@ public AvailabilityReplica this[string name] // TypeName: Microsoft.SqlServer.Management.Smo.DatabaseEncryptionKey // Used by: - // SqlAGDatabases + // SqlAGDatabase public class DatabaseEncryptionKey { public string EncryptorName; @@ -856,7 +856,7 @@ public class DatabaseEncryptionKey // TypeName: Microsoft.SqlServer.Management.Smo.Certificate // Used by: - // SqlAGDatabases + // SqlAGDatabase public class Certificate { public byte[] Thumbprint; @@ -864,7 +864,7 @@ public class Certificate // TypeName: Microsoft.SqlServer.Management.Smo.AvailabilityDatabaseCollection // Used by: - // SqlAGDatabases + // SqlAGDatabase public class AvailabilityDatabaseCollection : Collection { public AvailabilityDatabase this[string name] From 466f7e1bd9895175b931f134ac1c2f0ea27f5d70 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Mon, 13 Nov 2017 07:22:01 -0600 Subject: [PATCH 23/42] alphabatize resources list. remove extra line breaks. --- Examples/DSCClusterSqlBuild.ps1 | 1 - Examples/DSCFCISqlBuild.ps1 | 1 - Examples/SQL-ClusterDB.ps1 | 1 - Examples/SQL-Standalone.ps1 | 1 - Examples/SQLPush_SingleServer.ps1 | 1 - README.md | 26 +++++++++++++------------- 6 files changed, 13 insertions(+), 18 deletions(-) diff --git a/Examples/DSCClusterSqlBuild.ps1 b/Examples/DSCClusterSqlBuild.ps1 index df5753b5c..367b55a09 100644 --- a/Examples/DSCClusterSqlBuild.ps1 +++ b/Examples/DSCClusterSqlBuild.ps1 @@ -412,4 +412,3 @@ Workflow TestConfigs TestConfigs -computers $computers #> - diff --git a/Examples/DSCFCISqlBuild.ps1 b/Examples/DSCFCISqlBuild.ps1 index 03cb6b73b..53802d33b 100644 --- a/Examples/DSCFCISqlBuild.ps1 +++ b/Examples/DSCFCISqlBuild.ps1 @@ -212,4 +212,3 @@ Workflow StartConfigs } StartConfigs -Computers $computers -Path $OutputPath - diff --git a/Examples/SQL-ClusterDB.ps1 b/Examples/SQL-ClusterDB.ps1 index 8d7ae0da8..451b3015a 100644 --- a/Examples/SQL-ClusterDB.ps1 +++ b/Examples/SQL-ClusterDB.ps1 @@ -200,4 +200,3 @@ foreach($Node in $ConfigurationData.AllNodes) SQL -ConfigurationData $ConfigurationData Set-DscLocalConfigurationManager -Path .\SQL -Verbose Start-DscConfiguration -Path .\SQL -Verbose -Wait -Force - diff --git a/Examples/SQL-Standalone.ps1 b/Examples/SQL-Standalone.ps1 index 2574773ea..3cab9d36b 100644 --- a/Examples/SQL-Standalone.ps1 +++ b/Examples/SQL-Standalone.ps1 @@ -146,4 +146,3 @@ foreach($Node in $ConfigurationData.AllNodes) SQLSA -ConfigurationData $ConfigurationData Set-DscLocalConfigurationManager -Path .\SQLSA -Verbose Start-DscConfiguration -Path .\SQLSA -Verbose -Wait -Force - diff --git a/Examples/SQLPush_SingleServer.ps1 b/Examples/SQLPush_SingleServer.ps1 index 1d577a27a..e357c5cad 100644 --- a/Examples/SQLPush_SingleServer.ps1 +++ b/Examples/SQLPush_SingleServer.ps1 @@ -182,4 +182,3 @@ foreach($Computer in $Computers) { test-dscconfiguration -ComputerName $Computer } - diff --git a/README.md b/README.md index 1a7d3370a..8d83bd6d9 100644 --- a/README.md +++ b/README.md @@ -109,19 +109,17 @@ A full list of changes in each version can be found in the [change log](CHANGELO ## Resources -* [**SqlAlias**](#sqlalias) resource to manage SQL Server client Aliases. * [**SqlAG**](#sqlag) resource to ensure an availability group is present or absent. * [**SqlAGDatabase**](#SqlAGDatabase) to manage the database membership in Availability Groups. * [**SqlAGReplica**](#sqlagreplica) resource to ensure an availability group replica is present or absent. -* [**SqlAlwaysOnService**](#sqlalwaysonservice) resource to enable - always on on a SQL Server. +* [**SqlAlias**](#sqlalias) resource to manage SQL Server client Aliases. * [**SqlAGListener**](#sqlaglistener) Create or remove an availability group listener. -* [**SqlServerConfiguration**](#sqlserverconfiguration) resource to manage - [SQL Server Configuration Options](https://msdn.microsoft.com/en-us/library/ms189631.aspx). +* [**SqlAlwaysOnService**](#sqlalwaysonservice) resource to enable + always on on a SQL Server. * [**SqlDatabase**](#sqldatabase) resource to manage ensure database is present or absent. * [**SqlDatabaseDefaultLocation**](#sqldatabasedefaultlocation) resource @@ -134,13 +132,15 @@ A full list of changes in each version can be found in the [change log](CHANGELO to manage database recovery model. * [**SqlDatabaseRole**](#sqldatabaserole) resource to manage SQL database roles. +* [**SqlScript**](#sqlscript) resource to extend DSC Get/Set/Test + functionality to T-SQL. +* [**SqlServerConfiguration**](#sqlserverconfiguration) resource to manage + [SQL Server Configuration Options](https://msdn.microsoft.com/en-us/library/ms189631.aspx). * [**SqlServerEndpoint**](#sqlserverendpoint) resource to ensure database endpoint is present or absent. * [**SqlServerEndpointPermission**](#sqlserverendpointpermission) Grant or revoke permission on the endpoint. * [**SqlServerEndpointState**](#sqlserverendpointstate) Change state of the endpoint. -* [**SqlWindowsFirewall**](#sqlwindowsfirewall) configures firewall settings to - allow remote access to a SQL Server instance. * [**SqlServerLogin**](#sqlserverlogin) resource to manage SQL logins. * [**SqlServerMaxDop**](#sqlservermaxdop) resource to manage MaxDegree of Parallelism for SQL Server. @@ -149,20 +149,20 @@ A full list of changes in each version can be found in the [change log](CHANGELO Protocols. * [**SqlServerPermission**](#sqlserverpermission) Grant or revoke permission on the SQL Server. -* [**SqlServerRole**](#sqlserverrole) resource to manage SQL server roles. * [**SqlServerReplication**](#sqlserverreplication) resource to manage SQL Replication distribution and publishing. +* [**SqlServerRole**](#sqlserverrole) resource to manage SQL server roles. +* [**SqlServiceAccount**](#sqlserviceaccount) Manage the service account + for SQL Server services. +* [**SqlSetup**](#sqlsetup) installs a standalone SQL Server instance. * [**SqlRS**](#sqlrs) configures SQL Server Reporting Services to use a database engine in another instance. * [**SqlRSSecureConnectionLevel**](#sqlrssecureconnectionlevel) sets the secure connection level for SQL Server Reporting Services. -* [**SqlScript**](#sqlscript) resource to extend DSC Get/Set/Test - functionality to T-SQL. -* [**SqlServiceAccount**](#sqlserviceaccount) Manage the service account - for SQL Server services. -* [**SqlSetup**](#sqlsetup) installs a standalone SQL Server instance. * [**SqlWaitForAG**](#sqlwaitforag) resource to wait until availability group is created on primary server. +* [**SqlWindowsFirewall**](#sqlwindowsfirewall) configures firewall settings to + allow remote access to a SQL Server instance. ### SqlAlias From 110546b569463cf82c66a7feea0e4b2fb642deca Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Mon, 13 Nov 2017 10:01:25 -0600 Subject: [PATCH 24/42] Missed title in changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a3a2f2c25..402143629 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# Change log for xSQLServer +# Change log for SqlServerDsc ## Unreleased From fbbcbfbb148912ed00e5039d2c51ab6bf5d4d9a2 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 2 Nov 2017 11:24:01 -0500 Subject: [PATCH 25/42] Replace all instances of AlwaysOnAvailabilityGroup with "AOAG" --- .../MSFT_xSQLServerAOAG.psm1 | 769 ++++++++++++++ .../MSFT_xSQLServerAOAG.schema.mof | 26 + ...MSFT_xSQLServerAOAGDatabaseMembership.psm1 | 984 ++++++++++++++++++ ...SQLServerAOAGDatabaseMembership.schema.mof | 14 + ...LServerAOAGDatabaseMembership.strings.psd1 | 15 + ..._xSQLServerAOAGDatabaseMembership.help.txt | 50 + .../MSFT_xSQLServerAOAGReplica.psm1 | 709 +++++++++++++ .../MSFT_xSQLServerAOAGReplica.schema.mof | 24 + 8 files changed, 2591 insertions(+) create mode 100644 DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.psm1 create mode 100644 DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.schema.mof create mode 100644 DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.psm1 create mode 100644 DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.schema.mof create mode 100644 DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/MSFT_xSQLServerAOAGDatabaseMembership.strings.psd1 create mode 100644 DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/about_xSQLServerAOAGDatabaseMembership.help.txt create mode 100644 DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.psm1 create mode 100644 DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.schema.mof diff --git a/DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.psm1 b/DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.psm1 new file mode 100644 index 000000000..1c87a2bb6 --- /dev/null +++ b/DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.psm1 @@ -0,0 +1,769 @@ +Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` + -ChildPath 'xSQLServerHelper.psm1') ` + -Force + +<# + .SYNOPSIS + Gets the specified Availability Group. + + .PARAMETER Name + The name of the availability group. + + .PARAMETER SQLServer + Hostname of the SQL Server to be configured. + + .PARAMETER SQLInstanceName + Name of the SQL instance to be configured. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [String] + $SQLServer, + + [Parameter(Mandatory = $true)] + [String] + $SQLInstanceName + ) + + # Connect to the instance + $serverObject = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName + + # Define current version for check compatibility + $sqlMajorVersion = $serverObject.Version.Major + + # Get the endpoint properties + $endpoint = $serverObject.Endpoints | Where-Object { $_.EndpointType -eq 'DatabaseMirroring' } + if ( $endpoint ) + { + $endpointPort = $endpoint.Protocol.Tcp.ListenerPort + } + + # Get the Availability Group + $availabilityGroup = $serverObject.AvailabilityGroups[$Name] + + # Is this node actively hosting the SQL instance? + $isActiveNode = Test-ActiveNode -ServerObject $serverObject + + # Create the return object. Default ensure to Absent. + $alwaysOnAvailabilityGroupResource = @{ + Name = $Name + SQLServer = $SQLServer + SQLInstanceName = $SQLInstanceName + Ensure = 'Absent' + IsActiveNode = $isActiveNode + } + + if ( $availabilityGroup ) + { + # Get all of the properties that can be set using this resource + $alwaysOnAvailabilityGroupResource.Ensure = 'Present' + $alwaysOnAvailabilityGroupResource.AutomatedBackupPreference = $availabilityGroup.AutomatedBackupPreference + $alwaysOnAvailabilityGroupResource.AvailabilityMode = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].AvailabilityMode + $alwaysOnAvailabilityGroupResource.BackupPriority = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].BackupPriority + $alwaysOnAvailabilityGroupResource.ConnectionModeInPrimaryRole = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].ConnectionModeInPrimaryRole + $alwaysOnAvailabilityGroupResource.ConnectionModeInSecondaryRole = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].ConnectionModeInSecondaryRole + $alwaysOnAvailabilityGroupResource.FailureConditionLevel = $availabilityGroup.FailureConditionLevel + $alwaysOnAvailabilityGroupResource.FailoverMode = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].FailoverMode + $alwaysOnAvailabilityGroupResource.HealthCheckTimeout = $availabilityGroup.HealthCheckTimeout + $alwaysOnAvailabilityGroupResource.EndpointURL = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].EndpointUrl + $alwaysOnAvailabilityGroupResource.EndpointPort = $endpointPort + $alwaysOnAvailabilityGroupResource.SQLServerNetName = $serverObject.NetName + $alwaysOnAvailabilityGroupResource.Version = $sqlMajorVersion + + # Add properties that are only present in SQL 2016 or newer + if ( $sqlMajorVersion -ge 13 ) + { + $alwaysOnAvailabilityGroupResource.Add('BasicAvailabilityGroup', $availabilityGroup.BasicAvailabilityGroup) + $alwaysOnAvailabilityGroupResource.Add('DatabaseHealthTrigger', $availabilityGroup.DatabaseHealthTrigger) + $alwaysOnAvailabilityGroupResource.Add('DtcSupportEnabled', $availabilityGroup.DtcSupportEnabled) + } + } + + return $alwaysOnAvailabilityGroupResource +} + +<# + .SYNOPSIS + Creates or removes the availability group to in accordance with the desired state. + + .PARAMETER Name + The name of the availability group. + + .PARAMETER SQLServer + Hostname of the SQL Server to be configured. + + .PARAMETER SQLInstanceName + Name of the SQL instance to be configured. + + .PARAMETER Ensure + Specifies if the availability group should be present or absent. Default is Present. + + .PARAMETER AutomatedBackupPreference + Specifies the automated backup preference for the availability group. + + .PARAMETER AvailabilityMode + Specifies the replica availability mode. Default is 'AsynchronousCommit'. + + .PARAMETER BackupPriority + Specifies the desired priority of the replicas in performing backups. The acceptable values for this parameter are integers from 0 through 100. Of the set of replicas which are online and available, the replica that has the highest priority performs the backup. Default is 50. + + .PARAMETER BasicAvailabilityGroup + Specifies the type of availability group is Basic. This is only available is SQL Server 2016 and later and is ignored when applied to previous versions. + + .PARAMETER DatabaseHealthTrigger + Specifies if the option Database Level Health Detection is enabled. This is only available is SQL Server 2016 and later and is ignored when applied to previous versions. + + .PARAMETER DtcSupportEnabled + Specifies if the option Database DTC Support is enabled. This is only available is SQL Server 2016 and later and is ignored when applied to previous versions. This can't be altered once the Availability Group is created and is ignored if it is the case. + + .PARAMETER ConnectionModeInPrimaryRole + Specifies how the availability replica handles connections when in the primary role. + + .PARAMETER ConnectionModeInSecondaryRole + Specifies how the availability replica handles connections when in the secondary role. + + .PARAMETER EndpointHostName + Specifies the hostname or IP address of the availability group replica endpoint. Default is the instance network name. + + .PARAMETER FailureConditionLevel + Specifies the automatic failover behavior of the availability group. + + .PARAMETER HealthCheckTimeout + Specifies the length of time, in milliseconds, after which AlwaysOn availability groups declare an unresponsive server to be unhealthy. Default is 30,000. + + .PARAMETER ProcessOnlyOnActiveNode + Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server Instance. + Not used in Set-TargetResource. +#> +function Set-TargetResource +{ + [CmdletBinding()] + Param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [String] + $SQLServer, + + [Parameter(Mandatory = $true)] + [String] + $SQLInstanceName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [String] + $Ensure = 'Present', + + [Parameter()] + [ValidateSet('Primary', 'SecondaryOnly', 'Secondary', 'None')] + [String] + $AutomatedBackupPreference = 'None', + + [Parameter()] + [ValidateSet('AsynchronousCommit', 'SynchronousCommit')] + [String] + $AvailabilityMode = 'AsynchronousCommit', + + [Parameter()] + [ValidateRange(0, 100)] + [UInt32] + $BackupPriority = 50, + + [Parameter()] + [Boolean] + $BasicAvailabilityGroup, + + [Parameter()] + [Boolean] + $DatabaseHealthTrigger, + + [Parameter()] + [Boolean] + $DtcSupportEnabled, + + [Parameter()] + [ValidateSet('AllowAllConnections', 'AllowReadWriteConnections')] + [String] + $ConnectionModeInPrimaryRole, + + [Parameter()] + [ValidateSet('AllowNoConnections', 'AllowReadIntentConnectionsOnly', 'AllowAllConnections')] + [String] + $ConnectionModeInSecondaryRole, + + [Parameter()] + [String] + $EndpointHostName, + + [Parameter()] + [ValidateSet( + 'OnServerDown', + 'OnServerUnresponsive', + 'OnCriticalServerErrors', + 'OnModerateServerErrors', + 'OnAnyQualifiedFailureCondition' + )] + [String] + $FailureConditionLevel, + + [Parameter()] + [ValidateSet('Automatic', 'Manual')] + [String] + $FailoverMode = 'Manual', + + [Parameter()] + [UInt32] + $HealthCheckTimeout = 30000, + + [Parameter()] + [Boolean] + $ProcessOnlyOnActiveNode + ) + + Import-SQLPSModule + + # Connect to the instance + $serverObject = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName + + # Determine if HADR is enabled on the instance. If not, throw an error + if ( -not $serverObject.IsHadrEnabled ) + { + throw New-TerminatingError -ErrorType HadrNotEnabled -FormatArgs $Ensure, $SQLInstanceName -ErrorCategory NotImplemented + } + + # Define current version for check compatibility + $sqlMajorVersion = $serverObject.Version.Major + + # Get the Availability Group if it exists + $availabilityGroup = $serverObject.AvailabilityGroups[$Name] + + switch ($Ensure) + { + Absent + { + # If the AG exists + if ( $availabilityGroup ) + { + # If the primary replica is currently on this instance + if ( $availabilityGroup.PrimaryReplicaServerName -eq $serverObject.DomainInstanceName ) + { + try + { + Remove-SqlAvailabilityGroup -InputObject $availabilityGroup -ErrorAction Stop + } + catch + { + throw New-TerminatingError -ErrorType RemoveAvailabilityGroupFailed -FormatArgs $availabilityGroup.Name, $SQLInstanceName -ErrorCategory ResourceUnavailable -InnerException $_.Exception + } + } + else + { + throw New-TerminatingError -ErrorType InstanceNotPrimaryReplica -FormatArgs $SQLInstanceName, $availabilityGroup.Name -ErrorCategory ResourceUnavailable + } + } + } + + Present + { + # Ensure the appropriate cluster permissions are present + Test-ClusterPermissions -ServerObject $serverObject + + # Make sure a database mirroring endpoint exists. + $endpoint = $serverObject.Endpoints | Where-Object { $_.EndpointType -eq 'DatabaseMirroring' } + if ( -not $endpoint ) + { + throw New-TerminatingError -ErrorType DatabaseMirroringEndpointNotFound -FormatArgs $SQLServer, $SQLInstanceName -ErrorCategory ObjectNotFound + } + + if ( -not $EndpointHostName ) + { + $EndpointHostName = $serverObject.NetName + } + + # If the availability group does not exist, create it + if ( -not $availabilityGroup ) + { + # Set up the parameters to create the AG Replica + $newReplicaParams = @{ + Name = $serverObject.DomainInstanceName + Version = $sqlMajorVersion + AsTemplate = $true + AvailabilityMode = $AvailabilityMode + EndpointUrl = "TCP://$($EndpointHostName):$($endpoint.Protocol.Tcp.ListenerPort)" + FailoverMode = $FailoverMode + } + + if ( $BackupPriority ) + { + $newReplicaParams.Add('BackupPriority', $BackupPriority) + } + + if ( $ConnectionModeInPrimaryRole ) + { + $newReplicaParams.Add('ConnectionModeInPrimaryRole', $ConnectionModeInPrimaryRole) + } + + if ( $ConnectionModeInSecondaryRole ) + { + $newReplicaParams.Add('ConnectionModeInSecondaryRole', $ConnectionModeInSecondaryRole) + } + + # Create the new replica object + try + { + $primaryReplica = New-SqlAvailabilityReplica @newReplicaParams -ErrorAction Stop + } + catch + { + throw New-TerminatingError -ErrorType CreateAvailabilityGroupReplicaFailed -FormatArgs $newReplicaParams.Name, $SQLInstanceName -ErrorCategory OperationStopped -InnerException $_.Exception + } + + # Set up the parameters for the new availability group + $newAvailabilityGroupParams = @{ + InputObject = $serverObject + Name = $Name + AvailabilityReplica = $primaryReplica + } + + if ( $AutomatedBackupPreference ) + { + $newAvailabilityGroupParams.Add('AutomatedBackupPreference', $AutomatedBackupPreference) + } + + if ( $sqlMajorVersion -ge 13 ) + { + $newAvailabilityGroupParams.Add('BasicAvailabilityGroup', $BasicAvailabilityGroup) + $newAvailabilityGroupParams.Add('DatabaseHealthTrigger', $DatabaseHealthTrigger) + $newAvailabilityGroupParams.Add('DtcSupportEnabled', $DtcSupportEnabled) + } + + if ( $FailureConditionLevel ) + { + $newAvailabilityGroupParams.Add('FailureConditionLevel', $FailureConditionLevel) + } + + if ( $HealthCheckTimeout ) + { + $newAvailabilityGroupParams.Add('HealthCheckTimeout', $HealthCheckTimeout) + } + + # Create the Availability Group + try + { + New-SqlAvailabilityGroup @newAvailabilityGroupParams -ErrorAction Stop + } + catch + { + throw New-TerminatingError -ErrorType CreateAvailabilityGroupFailed -FormatArgs $Name -ErrorCategory OperationStopped -InnerException $_.Exception + } + } + # Otherwise let's check each of the parameters passed and update the Availability Group accordingly + else + { + # Get the parameters that were submitted to the function + [System.Array] $submittedParameters = $PSBoundParameters.Keys + + # Make sure we're communicating with the primary replica + $primaryServerObject = Get-PrimaryReplicaServerObject -ServerObject $serverObject -AvailabilityGroup $availabilityGroup + $availabilityGroup = $primaryServerObject.AvailabilityGroups[$Name] + + if ( ( $submittedParameters -contains 'AutomatedBackupPreference' ) -and ( $AutomatedBackupPreference -ne $availabilityGroup.AutomatedBackupPreference ) ) + { + $availabilityGroup.AutomatedBackupPreference = $AutomatedBackupPreference + Update-AvailabilityGroup -AvailabilityGroup $availabilityGroup + } + + if ( ( $submittedParameters -contains 'AvailabilityMode' ) -and ( $AvailabilityMode -ne $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].AvailabilityMode ) ) + { + $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].AvailabilityMode = $AvailabilityMode + Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName] + } + + if ( ( $submittedParameters -contains 'BackupPriority' ) -and ( $BackupPriority -ne $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].BackupPriority ) ) + { + $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].BackupPriority = $BackupPriority + Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName] + } + + if ( ( $submittedParameters -contains 'BasicAvailabilityGroup' ) -and ( $sqlMajorVersion -ge 13 ) -and ( $BasicAvailabilityGroup -ne $availabilityGroup.BasicAvailabilityGroup ) ) + { + $availabilityGroup.BasicAvailabilityGroup = $BasicAvailabilityGroup + Update-AvailabilityGroup -AvailabilityGroup $availabilityGroup + } + + if ( ( $submittedParameters -contains 'DatabaseHealthTrigger' ) -and ( $sqlMajorVersion -ge 13 ) -and ( $DatabaseHealthTrigger -ne $availabilityGroup.DatabaseHealthTrigger ) ) + { + $availabilityGroup.DatabaseHealthTrigger = $DatabaseHealthTrigger + Update-AvailabilityGroup -AvailabilityGroup $availabilityGroup + } + + # Make sure ConnectionModeInPrimaryRole has a value in order to avoid false positive matches when the parameter is not defined + if ( ( $submittedParameters -contains 'ConnectionModeInPrimaryRole' ) -and ( -not [string]::IsNullOrEmpty($ConnectionModeInPrimaryRole) ) -and ( $ConnectionModeInPrimaryRole -ne $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].ConnectionModeInPrimaryRole ) ) + { + $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].ConnectionModeInPrimaryRole = $ConnectionModeInPrimaryRole + Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName] + } + + # Make sure ConnectionModeInSecondaryRole has a value in order to avoid false positive matches when the parameter is not defined + if ( ( $submittedParameters -contains 'ConnectionModeInSecondaryRole' ) -and ( -not [string]::IsNullOrEmpty($ConnectionModeInSecondaryRole) ) -and ( $ConnectionModeInSecondaryRole -ne $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].ConnectionModeInSecondaryRole ) ) + { + $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].ConnectionModeInSecondaryRole = $ConnectionModeInSecondaryRole + Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName] + } + + # Break out the EndpointUrl properties + $currentEndpointProtocol, $currentEndpointHostName, $currentEndpointPort = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].EndpointUrl.Replace('//', '').Split(':') + + if ( $endpoint.Protocol.Tcp.ListenerPort -ne $currentEndpointPort ) + { + $newEndpointUrl = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].EndpointUrl.Replace($currentEndpointPort, $endpoint.Protocol.Tcp.ListenerPort) + $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].EndpointUrl = $newEndpointUrl + Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName] + } + + if ( ( $submittedParameters -contains 'EndpointHostName' ) -and ( $EndpointHostName -ne $currentEndpointHostName ) ) + { + $newEndpointUrl = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].EndpointUrl.Replace($currentEndpointHostName, $EndpointHostName) + $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].EndpointUrl = $newEndpointUrl + Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName] + } + + if ( $currentEndpointProtocol -ne 'TCP' ) + { + $newEndpointUrl = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].EndpointUrl.Replace($currentEndpointProtocol, 'TCP') + $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].EndpointUrl = $newEndpointUrl + Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName] + } + + # Make sure FailureConditionLevel has a value in order to avoid false positive matches when the parameter is not defined + if ( ( $submittedParameters -contains 'FailureConditionLevel' ) -and ( -not [string]::IsNullOrEmpty($FailureConditionLevel) ) -and ( $FailureConditionLevel -ne $availabilityGroup.FailureConditionLevel ) ) + { + $availabilityGroup.FailureConditionLevel = $FailureConditionLevel + Update-AvailabilityGroup -AvailabilityGroup $availabilityGroup + } + + if ( ( $submittedParameters -contains 'FailoverMode' ) -and ( $FailoverMode -ne $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].FailoverMode ) ) + { + $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].FailoverMode = $FailoverMode + Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName] + } + + if ( ( $submittedParameters -contains 'HealthCheckTimeout' ) -and ( $HealthCheckTimeout -ne $availabilityGroup.HealthCheckTimeout ) ) + { + $availabilityGroup.HealthCheckTimeout = $HealthCheckTimeout + Update-AvailabilityGroup -AvailabilityGroup $availabilityGroup + } + } + } + } +} + +<# + .SYNOPSIS + Determines if the availability group is in the desired state. + + .PARAMETER Name + The name of the availability group. + + .PARAMETER SQLServer + Hostname of the SQL Server to be configured. + + .PARAMETER SQLInstanceName + Name of the SQL instance to be configured. + + .PARAMETER Ensure + Specifies if the availability group should be present or absent. Default is Present. + + .PARAMETER AutomatedBackupPreference + Specifies the automated backup preference for the availability group. + + .PARAMETER AvailabilityMode + Specifies the replica availability mode. Default is 'AsynchronousCommit'. + + .PARAMETER BackupPriority + Specifies the desired priority of the replicas in performing backups. The acceptable values for this parameter are integers from 0 through 100. Of the set of replicas which are online and available, the replica that has the highest priority performs the backup. Default is 50. + + .PARAMETER BasicAvailabilityGroup + Specifies the type of availability group is Basic. This is only available is SQL Server 2016 and later and is ignored when applied to previous versions. + + .PARAMETER DatabaseHealthTrigger + Specifies if the option Database Level Health Detection is enabled. This is only available is SQL Server 2016 and later and is ignored when applied to previous versions. + + .PARAMETER DtcSupportEnabled + Specifies if the option Database DTC Support is enabled. This is only available is SQL Server 2016 and later and is ignored when applied to previous versions. + + .PARAMETER ConnectionModeInPrimaryRole + Specifies how the availability replica handles connections when in the primary role. + + .PARAMETER ConnectionModeInSecondaryRole + Specifies how the availability replica handles connections when in the secondary role. + + .PARAMETER EndpointHostName + Specifies the hostname or IP address of the availability group replica endpoint. Default is the instance network name. + + .PARAMETER FailureConditionLevel + Specifies the automatic failover behavior of the availability group. + + .PARAMETER HealthCheckTimeout + Specifies the length of time, in milliseconds, after which AlwaysOn availability groups declare an unresponsive server to be unhealthy. Default is 30,000. + + .PARAMETER ProcessOnlyOnActiveNode + Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server Instance. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + Param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [String] + $SQLServer, + + [Parameter(Mandatory = $true)] + [String] + $SQLInstanceName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [String] + $Ensure = 'Present', + + [Parameter()] + [ValidateSet('Primary', 'SecondaryOnly', 'Secondary', 'None')] + [String] + $AutomatedBackupPreference = 'None', + + [Parameter()] + [ValidateSet('AsynchronousCommit', 'SynchronousCommit')] + [String] + $AvailabilityMode = 'AsynchronousCommit', + + [Parameter()] + [ValidateRange(0, 100)] + [UInt32] + $BackupPriority = 50, + + [Parameter()] + [Boolean] + $BasicAvailabilityGroup, + + [Parameter()] + [Boolean] + $DatabaseHealthTrigger, + + [Parameter()] + [Boolean] + $DtcSupportEnabled, + + [Parameter()] + [ValidateSet('AllowAllConnections', 'AllowReadWriteConnections')] + [String] + $ConnectionModeInPrimaryRole, + + [Parameter()] + [ValidateSet('AllowNoConnections', 'AllowReadIntentConnectionsOnly', 'AllowAllConnections')] + [String] + $ConnectionModeInSecondaryRole, + + [Parameter()] + [String] + $EndpointHostName, + + [Parameter()] + [ValidateSet('OnServerDown', 'OnServerUnresponsive', 'OnCriticalServerErrors', 'OnModerateServerErrors', 'OnAnyQualifiedFailureCondition')] + [String] + $FailureConditionLevel, + + [Parameter()] + [ValidateSet('Automatic', 'Manual')] + [String] + $FailoverMode = 'Manual', + + [Parameter()] + [UInt32] + $HealthCheckTimeout = 30000, + + [Parameter()] + [Boolean] + $ProcessOnlyOnActiveNode + ) + + $getTargetResourceParameters = @{ + SQLInstanceName = $SQLInstanceName + SQLServer = $SQLServer + Name = $Name + } + + # Assume this will pass. We will determine otherwise later + $result = $true + + $getTargetResourceResult = Get-TargetResource @getTargetResourceParameters + + <# + If this is supposed to process only the active node, and this is not the + active node, don't bother evaluating the test. + #> + if ( $ProcessOnlyOnActiveNode -and -not $getTargetResourceResult.IsActiveNode ) + { + New-VerboseMessage -Message ( 'The node "{0}" is not actively hosting the instance "{1}". Exiting the test.' -f $env:COMPUTERNAME,$SQLInstanceName ) + return $result + } + + # Define current version for check compatibility + $sqlMajorVersion = $getTargetResourceResult.Version + + switch ($Ensure) + { + 'Absent' + { + if ( $getTargetResourceResult.Ensure -eq 'Absent' ) + { + $result = $true + } + else + { + $result = $false + } + } + + 'Present' + { + $parametersToCheck = @( + 'Name', + 'SQLServer', + 'SQLInstanceName', + 'Ensure', + 'AutomatedBackupPreference', + 'AvailabilityMode', + 'BackupPriority', + 'ConnectionModeInPrimaryRole', + 'ConnectionModeInSecondaryRole', + 'FailureConditionLevel', + 'FailoverMode', + 'HealthCheckTimeout' + ) + + <# + Add properties compatible with SQL Server 2016 or later versions + DtcSupportEnabled is enabled at the creation of the Availability Group only, hence it will not be checked in this block + #> + if ( $sqlMajorVersion -ge 13 ) + { + $parametersToCheck += 'BasicAvailabilityGroup' + $parametersToCheck += 'DatabaseHealthTrigger' + } + + if ( $getTargetResourceResult.Ensure -eq 'Present' ) + { + # Use $PSBoundParameters rather than $MyInvocation.MyCommand.Parameters.GetEnumerator() + # This allows us to only validate the supplied parameters + # If the parameter is not defined by the configuration, we don't care what + # it gets set to. + foreach ( $parameter in $PSBoundParameters.GetEnumerator() ) + { + $parameterName = $parameter.Key + $parameterValue = Get-Variable -Name $parameterName -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Value + + # Make sure we don't try to validate a common parameter + if ( $parametersToCheck -notcontains $parameterName ) + { + continue + } + + if ( $getTargetResourceResult.($parameterName) -ne $parameterValue ) + { + New-VerboseMessage -Message "'$($parameterName)' should be '$($parameterValue)' but is '$($getTargetResourceResult.($parameterName))'" + + $result = $False + } + } + + # Get the Endpoint URL properties + $currentEndpointProtocol, $currentEndpointHostName, $currentEndpointPort = $getTargetResourceResult.EndpointUrl.Replace('//', '').Split(':') + + if ( -not $EndpointHostName ) + { + $EndpointHostName = $getTargetResourceResult.SQLServerNetName + } + + # Verify the hostname in the endpoint URL is correct + if ( $EndpointHostName -ne $currentEndpointHostName ) + { + New-VerboseMessage -Message "'EndpointHostName' should be '$EndpointHostName' but is '$currentEndpointHostName'" + $result = $false + } + + # Verify the protocol in the endpoint URL is correct + if ( 'TCP' -ne $currentEndpointProtocol ) + { + New-VerboseMessage -Message "'EndpointProtocol' should be 'TCP' but is '$currentEndpointProtocol'" + $result = $false + } + + # Verify the port in the endpoint URL is correct + if ( $getTargetResourceResult.EndpointPort -ne $currentEndpointPort ) + { + New-VerboseMessage -Message "'EndpointPort' should be '$($getTargetResourceResult.EndpointPort)' but is '$currentEndpointPort'" + $result = $false + } + } + else + { + $result = $false + } + } + } + + return $result +} + +<# + .SYNOPSIS + Executes the alter method on an Availability Group object. + + .PARAMETER AvailabilityGroup + The Availability Group object that must be altered. +#> +function Update-AvailabilityGroup +{ + param + ( + [Parameter(Mandatory = $true)] + [Microsoft.SqlServer.Management.Smo.AvailabilityGroup] + $AvailabilityGroup + ) + + try + { + $originalErrorActionPreference = $ErrorActionPreference + $ErrorActionPreference = 'Stop' + $AvailabilityGroup.Alter() + } + catch + { + throw New-TerminatingError -ErrorType AlterAvailabilityGroupFailed -FormatArgs $AvailabilityGroup.Name -ErrorCategory OperationStopped -InnerException $_.Exception + } + finally + { + $ErrorActionPreference = $originalErrorActionPreference + } +} + +Export-ModuleMember -Function *-TargetResource diff --git a/DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.schema.mof b/DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.schema.mof new file mode 100644 index 000000000..521516263 --- /dev/null +++ b/DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.schema.mof @@ -0,0 +1,26 @@ +[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerAOAG")] +class MSFT_xSQLServerAOAG : OMI_BaseResource +{ + [Key, Description("The name of the availability group.")] String Name; + [Required, Description("Hostname of the SQL Server to be configured.")] String SQLServer; + [Key, Description("Name of the SQL instance to be configured.")] String SQLInstanceName; + [Write, Description("Specifies if the availability group should be present or absent. Default is Present."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Write, Description("Specifies the automated backup preference for the availability group. Default is None"), ValueMap{"Primary","SecondaryOnly","Secondary","None"}, Values{"Primary","SecondaryOnly","Secondary","None"}] String AutomatedBackupPreference; + [Write, Description("Specifies the replica availability mode. Default is 'AsynchronousCommit'."), ValueMap{"AsynchronousCommit","SynchronousCommit"}, Values{"AsynchronousCommit","SynchronousCommit"}] String AvailabilityMode; + [Write, Description("Specifies the desired priority of the replicas in performing backups. The acceptable values for this parameter are: integers from 0 through 100. Of the set of replicas which are online and available, the replica that has the highest priority performs the backup. Default is 50.")] UInt32 BackupPriority; + [Write, Description("Specifies the type of availability group is Basic. This is only available is SQL Server 2016 and later and is ignored when applied to previous versions.")] Boolean BasicAvailabilityGroup; + [Write, Description("Specifies if the option Database Level Health Detection is enabled. This is only available is SQL Server 2016 and later and is ignored when applied to previous versions.")] Boolean DatabaseHealthTrigger; + [Write, Description("Specifies if the option Database DTC Support is enabled. This is only available is SQL Server 2016 and later and is ignored when applied to previous versions. This can't be altered once the Availability Group is created and is ignored if it is the case.")] Boolean DtcSupportEnabled; + [Write, Description("Specifies how the availability replica handles connections when in the primary role."), ValueMap{"AllowAllConnections","AllowReadWriteConnections"}, Values{"AllowAllConnections","AllowReadWriteConnections"}] String ConnectionModeInPrimaryRole; + [Write, Description("Specifies how the availability replica handles connections when in the secondary role."), ValueMap{"AllowNoConnections","AllowReadIntentConnectionsOnly","AllowAllConnections"}, Values{"AllowNoConnections","AllowReadIntentConnectionsOnly","AllowAllConnections"}] String ConnectionModeInSecondaryRole; + [Write, Description("Specifies the hostname or IP address of the availability group replica endpoint. Default is the instance network name.")] String EndpointHostName; + [Write, Description("Specifies the automatic failover behavior of the availability group."), ValueMap{"OnServerDown","OnServerUnresponsive","OnCriticalServerErrors","OnModerateServerErrors","OnAnyQualifiedFailureCondition"}, Values{"OnServerDown","OnServerUnresponsive","OnCriticalServerErrors","OnModerateServerErrors","OnAnyQualifiedFailureCondition"}] String FailureConditionLevel; + [Write, Description("Specifies the failover mode. Default is 'Manual'."), ValueMap{"Automatic","Manual"}, Values{"Automatic","Manual"}] String FailoverMode; + [Write, Description("Specifies the length of time, in milliseconds, after which AlwaysOn availability groups declare an unresponsive server to be unhealthy. Default is 30000.")] UInt32 HealthCheckTimeout; + [Write, Description("Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server Instance.")] Boolean ProcessOnlyOnActiveNode; + [Read, Description("Gets the Endpoint URL of the availability group replica endpoint.")] String EndpointUrl; + [Read, Description("Gets the port the database mirroring endpoint is listening on.")] UInt32 EndpointPort; + [Read, Description("Gets the hostname the SQL Server instance is listening on.")] String SQLServerNetName; + [Read, Description("Gets the major version of the SQL Server instance.")] UInt32 Version; + [Read, Description("Determines if the current node is actively hosting the SQL Server instance.")] Boolean IsActiveNode; +}; diff --git a/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.psm1 b/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.psm1 new file mode 100644 index 000000000..b86c1a5aa --- /dev/null +++ b/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.psm1 @@ -0,0 +1,984 @@ +Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` + -ChildPath 'xSQLServerHelper.psm1') ` + -Force + +Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` + -ChildPath 'CommonResourceHelper.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_xSQLServerAOAGDatabaseMembership' + +<# + .SYNOPSIS + Gets the database membership of the specified availability group. + + .PARAMETER DatabaseName + The name of the database(s) to add to the availability group. This accepts wildcards. + + .PARAMETER SQLServer + Hostname of the SQL Server where the primary replica of the availability group lives. If the + availability group is not currently on this server, the resource will attempt to connect to the + server where the primary replica lives. + + .PARAMETER SQLInstanceName + Name of the SQL instance where the primary replica of the availability group lives. If the + availability group is not currently on this instance, the resource will attempt to connect to + the instance where the primary replica lives. + + .PARAMETER AvailabilityGroupName + The name of the availability group in which to manage the database membership(s). + + .PARAMETER BackupPath + The path used to seed the availability group replicas. This should be a path that is accessible + by all of the replicas. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String[]] + $DatabaseName, + + [Parameter(Mandatory = $true)] + [System.String] + $SQLServer, + + [Parameter(Mandatory = $true)] + [System.String] + $SQLInstanceName, + + [Parameter(Mandatory = $true)] + [System.String] + $AvailabilityGroupName, + + [Parameter(Mandatory = $true)] + [System.String] + $BackupPath + ) + + # Create an object that reflects the current configuration + $currentConfiguration = @{ + DatabaseName = @() + SQLServer = $SQLServer + SQLInstanceName = $SQLInstanceName + AvailabilityGroupName = '' + BackupPath = '' + Ensure = '' + Force = $false + MatchDatabaseOwner = $false + IsActiveNode = $false + } + + # Connect to the instance + $serverObject = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName + + # Is this node actively hosting the SQL instance? + $currentConfiguration.IsActiveNode = Test-ActiveNode -ServerObject $serverObject + + # Get the Availability group object + $availabilityGroup = $serverObject.AvailabilityGroups[$AvailabilityGroupName] + + if ( $availabilityGroup ) + { + $currentConfiguration.AvailabilityGroupName = $AvailabilityGroupName + + # Get the databases in the availability group + $currentConfiguration.DatabaseName = $availabilityGroup.AvailabilityDatabases | Select-Object -ExpandProperty Name + } + else + { + Write-Verbose -Message ($script:localizedData.AvailabilityGroupDoesNotExist -f $AvailabilityGroupName) + } + + return $currentConfiguration +} + +<# + .SYNOPSIS + Adds or removes databases to the specified availability group. + + .PARAMETER DatabaseName + The name of the database(s) to add to the availability group. This accepts wildcards. + + .PARAMETER SQLServer + Hostname of the SQL Server where the primary replica of the availability group lives. If the + availability group is not currently on this server, the resource will attempt to connect to the + server where the primary replica lives. + + .PARAMETER SQLInstanceName + Name of the SQL instance where the primary replica of the availability group lives. If the + availability group is not currently on this instance, the resource will attempt to connect to + the instance where the primary replica lives. + + .PARAMETER AvailabilityGroupName + The name of the availability group in which to manage the database membership(s). + + .PARAMETER BackupPath + The path used to seed the availability group replicas. This should be a path that is accessible + by all of the replicas. + + .PARAMETER Ensure + Specifies the membership of the database(s) in the availability group. The options are: + + - Present: The defined database(s) are added to the availability group. All other + databases that may be a member of the availability group are ignored. + - Absent: The defined database(s) are removed from the availability group. All other + databases that may be a member of the availability group are ignored. + + The default is 'Present'. + + .PARAMETER Force + When used with "Ensure = 'Present'" it ensures the specified database(s) are the only databases + that are a member of the specified Availability Group. + + This parameter is ignored when 'Ensure' is 'Absent'. + + .PARAMETER MatchDatabaseOwner + If set to $true, this ensures the database owner of the database on the primary replica is the + owner of the database on all secondary replicas. This requires the database owner is available + as a login on all replicas and that the PSDscRunAsCredential has impersonate permissions. + + If set to $false, the owner of the database will be the PSDscRunAsCredential. + + The default is '$true'. + + .PARAMETER ProcessOnlyOnActiveNode + Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server Instance. + Not used in Set-TargetResource. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String[]] + $DatabaseName, + + [Parameter(Mandatory = $true)] + [System.String] + $SQLServer, + + [Parameter(Mandatory = $true)] + [System.String] + $SQLInstanceName, + + [Parameter(Mandatory = $true)] + [System.String] + $AvailabilityGroupName, + + [Parameter(Mandatory = $true)] + [System.String] + $BackupPath, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [Boolean] + $Force, + + [Parameter()] + [Boolean] + $MatchDatabaseOwner, + + [Parameter()] + [Boolean] + $ProcessOnlyOnActiveNode + ) + + Import-SQLPSModule + + # Connect to the defined instance + $serverObject = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName + + # Get the Availability Group + $availabilityGroup = $serverObject.AvailabilityGroups[$AvailabilityGroupName] + + # Make sure we're communicating with the primary replica in order to make changes to the replica + $primaryServerObject = Get-PrimaryReplicaServerObject -ServerObject $serverObject -AvailabilityGroup $availabilityGroup + + $getDatabasesToAddToAvailabilityGroupParameters = @{ + DatabaseName = $DatabaseName + Ensure = $Ensure + ServerObject = $primaryServerObject + AvailabilityGroup = $availabilityGroup + } + $databasesToAddToAvailabilityGroup = Get-DatabasesToAddToAvailabilityGroup @getDatabasesToAddToAvailabilityGroupParameters + + $getDatabasesToRemoveFromAvailabilityGroupParameters = @{ + DatabaseName = $DatabaseName + Ensure = $Ensure + Force = $Force + ServerObject = $primaryServerObject + AvailabilityGroup = $availabilityGroup + } + $databasesToRemoveFromAvailabilityGroup = Get-DatabasesToRemoveFromAvailabilityGroup @getDatabasesToRemoveFromAvailabilityGroupParameters + + # Create a hash table to store the databases that failed to be added to the Availability Group + $databasesToAddFailures = @{} + + # Create a hash table to store the databases that failed to be added to the Availability Group + $databasesToRemoveFailures = @{} + + if ( $databasesToAddToAvailabilityGroup.Count -gt 0 ) + { + Write-Verbose -Message ($script:localizedData.AddingDatabasesToAvailabilityGroup -f $AvailabilityGroupName, ( $databasesToAddToAvailabilityGroup -join ', ' )) + + # Get only the secondary replicas. Some tests do not need to be performed on the primary replica + $secondaryReplicas = $availabilityGroup.AvailabilityReplicas | Where-Object -FilterScript { $_.Role -ne 'Primary' } + + # Ensure the appropriate permissions are in place on all the replicas + if ( $MatchDatabaseOwner ) + { + $impersonatePermissionsStatus = @{} + + foreach ( $availabilityGroupReplica in $secondaryReplicas ) + { + $currentAvailabilityGroupReplicaServerObject = Connect-SQL -SQLServer $availabilityGroupReplica.Name + $impersonatePermissionsStatus.Add( + $availabilityGroupReplica.Name, + ( Test-ImpersonatePermissions -ServerObject $currentAvailabilityGroupReplicaServerObject ) + ) + } + + if ( $impersonatePermissionsStatus.Values -contains $false ) + { + $impersonatePermissionsMissingParameters = @( + [System.Security.Principal.WindowsIdentity]::GetCurrent().Name, + ( ( $impersonatePermissionsStatus.GetEnumerator() | Where-Object -FilterScript { -not $_.Value } | Select-Object -ExpandProperty Key ) -join ', ' ) + ) + throw ($script:localizedData.ImpersonatePermissionsMissing -f $impersonatePermissionsMissingParameters ) + } + } + + foreach ( $databaseToAddToAvailabilityGroup in $databasesToAddToAvailabilityGroup ) + { + $databaseObject = $primaryServerObject.Databases[$databaseToAddToAvailabilityGroup] + + <# + Verify the prerequisites prior to joining the database to the availability group + https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/prereqs-restrictions-recommendations-always-on-availability#a-nameprerequisitesfordbsa-availability-database-prerequisites-and-restrictions + #> + + # Create a hash table to store prerequisite check failures + $prerequisiteCheckFailures = @() + + $prerequisiteChecks = @{ + RecoveryModel = 'Full' + ReadOnly = $false + UserAccess = 'Multiple' + AutoClose = $false + AvailabilityGroupName = '' + IsMirroringEnabled = $false + } + + foreach ( $prerequisiteCheck in $prerequisiteChecks.GetEnumerator() ) + { + if ( $databaseObject.($prerequisiteCheck.Key) -ne $prerequisiteCheck.Value ) + { + $prerequisiteCheckFailures += "$($prerequisiteCheck.Key) is not $($prerequisiteCheck.Value)." + } + } + + # Cannot be a system database + if ( $databaseObject.ID -le 4 ) + { + $prerequisiteCheckFailures += 'The database cannot be a system database.' + } + + # If FILESTREAM is enabled, ensure FILESTREAM is enabled on all replica instances + if ( + ( -not [System.String]::IsNullOrEmpty($databaseObject.DefaultFileStreamFileGroup) ) ` + -or ( -not [System.String]::IsNullOrEmpty($databaseObject.FilestreamDirectoryName) ) ` + -or ( $databaseObject.FilestreamNonTransactedAccess -ne 'Off' ) + ) + { + $availabilityReplicaFilestreamLevel = @{} + foreach ( $availabilityGroupReplica in $secondaryReplicas ) + { + $connectSqlParameters = Split-FullSQLInstanceName -FullSQLInstanceName $availabilityGroupReplica.Name + $currentAvailabilityGroupReplicaServerObject = Connect-SQL @connectSqlParameters + $availabilityReplicaFilestreamLevel.Add($availabilityGroupReplica.Name, $currentAvailabilityGroupReplicaServerObject.FilestreamLevel) + } + + if ( $availabilityReplicaFilestreamLevel.Values -contains 'Disabled' ) + { + $availabilityReplicaFilestreamLevelDisabled = $availabilityReplicaFilestreamLevel.GetEnumerator() | Where-Object { $_.Value -eq 'Disabled' } | Select-Object -ExpandProperty Key + $prerequisiteCheckFailures += ( 'Filestream is disabled on the following instances: {0}' -f ( $availabilityReplicaFilestreamLevelDisabled -join ', ' ) ) + } + } + + # If the database is contained, ensure contained database authentication is enabled on all replica instances + if ( $databaseObject.ContainmentType -ne 'None' ) + { + $availabilityReplicaContainmentEnabled = @{} + foreach ( $availabilityGroupReplica in $secondaryReplicas ) + { + $connectSqlParameters = Split-FullSQLInstanceName -FullSQLInstanceName $availabilityGroupReplica.Name + $currentAvailabilityGroupReplicaServerObject = Connect-SQL @connectSqlParameters + $availabilityReplicaContainmentEnabled.Add($availabilityGroupReplica.Name, $currentAvailabilityGroupReplicaServerObject.Configuration.ContainmentEnabled.ConfigValue) + } + + if ( $availabilityReplicaContainmentEnabled.Values -notcontains 'None' ) + { + $availabilityReplicaContainmentNotEnabled = $availabilityReplicaContainmentEnabled.GetEnumerator() | Where-Object { $_.Value -eq 'None' } | Select-Object -ExpandProperty Key + $prerequisiteCheckFailures += ( 'Contained Database Authentication is not enabled on the following instances: {0}' -f ( $availabilityReplicaContainmentNotEnabled -join ', ' ) ) + } + } + + # Ensure the data and log file paths exist on all replicas + $databaseFileDirectories = @() + $databaseFileDirectories += $databaseObject.FileGroups.Files.FileName | ForEach-Object { Split-Path -Path $_ -Parent } + $databaseFileDirectories += $databaseObject.LogFiles.FileName | ForEach-Object { Split-Path -Path $_ -Parent } + $databaseFileDirectories = $databaseFileDirectories | Select-Object -Unique + + $availabilityReplicaMissingDirectories = @{} + foreach ( $availabilityGroupReplica in $secondaryReplicas ) + { + $connectSqlParameters = Split-FullSQLInstanceName -FullSQLInstanceName $availabilityGroupReplica.Name + $currentAvailabilityGroupReplicaServerObject = Connect-SQL @connectSqlParameters + + $missingDirectories = @() + foreach ( $databaseFileDirectory in $databaseFileDirectories ) + { + $fileExistsQuery = "EXEC master.dbo.xp_fileexist '$databaseFileDirectory'" + $fileExistsResult = Invoke-Query -SQLServer $currentAvailabilityGroupReplicaServerObject.NetName -SQLInstanceName $currentAvailabilityGroupReplicaServerObject.ServiceName -Database master -Query $fileExistsQuery -WithResults + + if ( $fileExistsResult.Tables.Rows.'File is a Directory' -ne 1 ) + { + $missingDirectories += $databaseFileDirectory + } + } + + if ( $missingDirectories.Count -gt 0 ) + { + $availabilityReplicaMissingDirectories.Add($availabilityGroupReplica, ( $missingDirectories -join ', ' )) + } + } + + if ( $availabilityReplicaMissingDirectories.Count -gt 0 ) + { + foreach ( $availabilityReplicaMissingDirectory in $availabilityReplicaMissingDirectories.GetEnumerator() ) + { + $prerequisiteCheckFailures += "The instance '$($availabilityReplicaMissingDirectory.Key.Name)' is missing the following directories: $($availabilityReplicaMissingDirectory.Value)" + } + } + + # If the database is TDE'd, ensure the certificate or asymmetric key is installed on all replicas + if ( $databaseObject.EncryptionEnabled ) + { + $databaseCertificateThumbprint = [System.BitConverter]::ToString($databaseObject.DatabaseEncryptionKey.Thumbprint) + $databaseCertificateName = $databaseObject.DatabaseEncryptionKey.EncryptorName + + $availabilityReplicaMissingCertificates = @{} + foreach ( $availabilityGroupReplica in $secondaryReplicas ) + { + $connectSqlParameters = Split-FullSQLInstanceName -FullSQLInstanceName $availabilityGroupReplica.Name + $currentAvailabilityGroupReplicaServerObject = Connect-SQL @connectSqlParameters + [System.Array]$installedCertificateThumbprints = $currentAvailabilityGroupReplicaServerObject.Databases['master'].Certificates | ForEach-Object { [System.BitConverter]::ToString($_.Thumbprint) } + + if ( $installedCertificateThumbprints -notcontains $databaseCertificateThumbprint ) + { + $availabilityReplicaMissingCertificates.Add($availabilityGroupReplica, $databaseCertificateName) + } + } + + if ( $availabilityReplicaMissingCertificates.Count -gt 0 ) + { + foreach ( $availabilityReplicaMissingCertificate in $availabilityReplicaMissingCertificates.GetEnumerator() ) + { + $prerequisiteCheckFailures += "The instance '$($availabilityReplicaMissingCertificate.Key.Name)' is missing the following certificates: $($availabilityReplicaMissingCertificate.Value)" + } + } + } + + if ( $prerequisiteCheckFailures.Count -eq 0 ) + { + $databaseFullBackupFile = Join-Path -Path $BackupPath -ChildPath "$($databaseObject.Name)_Full_$(Get-Date -Format 'yyyyMMddhhmmss').bak" + $databaseLogBackupFile = Join-Path -Path $BackupPath -ChildPath "$($databaseObject.Name)_Log_$(Get-Date -Format 'yyyyMMddhhmmss').trn" + + # Build the backup parameters. If no backup was previously taken, a standard full will be taken. Otherwise a CopyOnly backup will be taken. + $backupSqlDatabaseParameters = @{ + DatabaseObject = $databaseObject + BackupAction = 'Database' + BackupFile = $databaseFullBackupFile + ErrorAction = 'Stop' + } + + # If no full backup was ever taken, do not take a backup with CopyOnly + if ( $databaseObject.LastBackupDate -ne 0 ) + { + $backupSqlDatabaseParameters.Add('CopyOnly', $true) + } + + try + { + Backup-SqlDatabase @backupSqlDatabaseParameters + } + catch + { + # Log the failure + $databasesToAddFailures.Add($databaseToAddToAvailabilityGroup, $_.Exception) + + # Move on to the next database + continue + } + + # Create the parameters to perform a transaction log backup + $backupSqlDatabaseLogParams = @{ + DatabaseObject = $databaseObject + BackupAction = 'Log' + BackupFile = $databaseLogBackupFile + ErrorAction = 'Stop' + } + + try + { + Backup-SqlDatabase @backupSqlDatabaseLogParams + } + catch + { + # Log the failure + $databasesToAddFailures.Add($databaseToAddToAvailabilityGroup, $_.Exception) + + # Move on to the next database + continue + } + + # Add the database to the availability group on the primary instance + try + { + Add-SqlAvailabilityDatabase -InputObject $availabilityGroup -Database $databaseToAddToAvailabilityGroup + } + catch + { + # Log the failure + $databasesToAddFailures.Add($databaseToAddToAvailabilityGroup, $_.Exception) + + # Move on to the next database + continue + } + + # Need to restore the database with a query in order to impersonate the correct login + $restoreDatabaseQueryStringBuilder = New-Object -TypeName System.Text.StringBuilder + + if ( $MatchDatabaseOwner ) + { + $restoreDatabaseQueryStringBuilder.Append('EXECUTE AS LOGIN = ''') | Out-Null + $restoreDatabaseQueryStringBuilder.Append($databaseObject.Owner) | Out-Null + $restoreDatabaseQueryStringBuilder.AppendLine('''') | Out-Null + } + + $restoreDatabaseQueryStringBuilder.Append('RESTORE DATABASE [') | Out-Null + $restoreDatabaseQueryStringBuilder.Append($databaseToAddToAvailabilityGroup) | Out-Null + $restoreDatabaseQueryStringBuilder.AppendLine(']') | Out-Null + $restoreDatabaseQueryStringBuilder.Append('FROM DISK = ''') | Out-Null + $restoreDatabaseQueryStringBuilder.Append($databaseFullBackupFile) | Out-Null + $restoreDatabaseQueryStringBuilder.AppendLine('''') | Out-Null + $restoreDatabaseQueryStringBuilder.Append('WITH NORECOVERY') | Out-Null + $restoreDatabaseQueryString = $restoreDatabaseQueryStringBuilder.ToString() + + # Build the parameters to restore the transaction log + $restoreSqlDatabaseLogParameters = @{ + Database = $databaseToAddToAvailabilityGroup + BackupFile = $databaseLogBackupFile + RestoreAction = 'Log' + NoRecovery = $true + } + + try + { + foreach ( $availabilityGroupReplica in $secondaryReplicas ) + { + # Connect to the replica + $connectSqlParameters = Split-FullSQLInstanceName -FullSQLInstanceName $availabilityGroupReplica.Name + $currentAvailabilityGroupReplicaServerObject = Connect-SQL @connectSqlParameters + $currentReplicaAvailabilityGroupObject = $currentAvailabilityGroupReplicaServerObject.AvailabilityGroups[$AvailabilityGroupName] + + # Restore the database + Invoke-Query -SQLServer $currentAvailabilityGroupReplicaServerObject.NetName -SQLInstanceName $currentAvailabilityGroupReplicaServerObject.ServiceName -Database master -Query $restoreDatabaseQueryString + Restore-SqlDatabase -InputObject $currentAvailabilityGroupReplicaServerObject @restoreSqlDatabaseLogParameters + + # Add the database to the Availability Group + Add-SqlAvailabilityDatabase -InputObject $currentReplicaAvailabilityGroupObject -Database $databaseToAddToAvailabilityGroup + } + } + catch + { + # Log the failure + $databasesToAddFailures.Add($databaseToAddToAvailabilityGroup, $_.Exception) + + # Move on to the next database + continue + } + finally + { + # Clean up the backup files + Remove-Item -Path $databaseFullBackupFile, $databaseLogBackupFile -Force -ErrorAction Continue + } + } + else + { + $databasesToAddFailures.Add($databaseToAddToAvailabilityGroup, "The following prerequisite checks failed: $( $prerequisiteCheckFailures -join "`r`n" )" ) + } + } + } + + if ( $databasesToRemoveFromAvailabilityGroup.Count -gt 0 ) + { + Write-Verbose -Message ($script:localizedData.RemovingDatabasesToAvailabilityGroup -f $AvailabilityGroupName, ( $databasesToRemoveFromAvailabilityGroup -join ', ' )) + + foreach ( $databaseToAddToAvailabilityGroup in $databasesToRemoveFromAvailabilityGroup ) + { + $availabilityDatabase = $primaryServerObject.AvailabilityGroups[$AvailabilityGroupName].AvailabilityDatabases[$databaseToAddToAvailabilityGroup] + + try + { + Remove-SqlAvailabilityDatabase -InputObject $availabilityDatabase -ErrorAction Stop + } + catch + { + $databasesToRemoveFailures.Add($databaseToAddToAvailabilityGroup, 'Failed to remove the database from the availability group.') + } + } + } + + # Combine the failures into one error message and throw it here. Doing this will allow all the databases that can be processes to be processed and will still show that applying the configuration failed + if ( ( $databasesToAddFailures.Count -gt 0 ) -or ( $databasesToRemoveFailures.Count -gt 0 ) ) + { + $formatArgs = @() + foreach ( $failure in ( $databasesToAddFailures.GetEnumerator() + $databasesToRemoveFailures.GetEnumerator() ) ) + { + $formatArgs += "The operation on the database '$( $failure.Key )' failed with the following errors: $( $failure.Value -join "`r`n" )" + } + + throw ($script:localizedData.AlterAvailabilityGroupDatabaseMembershipFailure -f $formatArgs ) + } +} + +<# + .SYNOPSIS + Tests the database membership of the specified Availability Group. + + .PARAMETER DatabaseName + The name of the database(s) to add to the availability group. This accepts wildcards. + + .PARAMETER SQLServer + Hostname of the SQL Server where the primary replica of the availability group lives. If the + availability group is not currently on this server, the resource will attempt to connect to the + server where the primary replica lives. + + .PARAMETER SQLInstanceName + Name of the SQL instance where the primary replica of the availability group lives. If the + availability group is not currently on this instance, the resource will attempt to connect to + the instance where the primary replica lives. + + .PARAMETER AvailabilityGroupName + The name of the availability group in which to manage the database membership(s). + + .PARAMETER BackupPath + The path used to seed the availability group replicas. This should be a path that is accessible + by all of the replicas. + + .PARAMETER Ensure + Specifies the membership of the database(s) in the availability group. The options are: + + - Present: The defined database(s) are added to the availability group. All other + databases that may be a member of the availability group are ignored. + - Absent: The defined database(s) are removed from the availability group. All other + databases that may be a member of the availability group are ignored. + + The default is 'Present'. + + .PARAMETER Force + When used with "Ensure = 'Present'" it ensures the specified database(s) are the only databases + that are a member of the specified Availability Group. + + This parameter is ignored when 'Ensure' is 'Absent'. + + .PARAMETER MatchDatabaseOwner + If set to $true, this ensures the database owner of the database on the primary replica is the + owner of the database on all secondary replicas. This requires the database owner is available + as a login on all replicas and that the PSDscRunAsCredential has impersonate permissions. + + If set to $false, the owner of the database will be the PSDscRunAsCredential. + + The default is '$true'. + + .PARAMETER ProcessOnlyOnActiveNode + Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server Instance. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String[]] + $DatabaseName, + + [Parameter(Mandatory = $true)] + [System.String] + $SQLServer, + + [Parameter(Mandatory = $true)] + [System.String] + $SQLInstanceName, + + [Parameter(Mandatory = $true)] + [System.String] + $AvailabilityGroupName, + + [Parameter(Mandatory = $true)] + [System.String] + $BackupPath, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [Boolean] + $Force, + + [Parameter()] + [Boolean] + $MatchDatabaseOwner, + + [Parameter()] + [Boolean] + $ProcessOnlyOnActiveNode + ) + + $configurationInDesiredState = $true + + $getTargetResourceParameters = @{ + DatabaseName = $DatabaseName + SQLServer = $SQLServer + SQLInstanceName = $SQLInstanceName + AvailabilityGroupName = $AvailabilityGroupName + BackupPath = $BackupPath + } + $currentConfiguration = Get-TargetResource @getTargetResourceParameters + + <# + If this is supposed to process only the active node, and this is not the + active node, don't bother evaluating the test. + #> + if ( $ProcessOnlyOnActiveNode -and -not $currentConfiguration.IsActiveNode ) + { + Write-Verbose -Message ( $script:localizedData.NotActiveNode -f $env:COMPUTERNAME,$SQLInstanceName ) + return $configurationInDesiredState + } + + # Connect to the defined instance + $serverObject = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName + + # Get the Availability Group if it exists + if ( -not [string]::IsNullOrEmpty($currentConfiguration.AvailabilityGroupName) ) + { + $availabilityGroup = $serverObject.AvailabilityGroups[$AvailabilityGroupName] + + # Make sure we're communicating with the primary replica in order to make changes to the replica + $primaryServerObject = Get-PrimaryReplicaServerObject -ServerObject $serverObject -AvailabilityGroup $availabilityGroup + + $matchingDatabaseNames = Get-MatchingDatabaseNames -DatabaseName $DatabaseName -ServerObject $primaryServerObject + $databasesNotFoundOnTheInstance = @() + + if ( ( $Ensure -eq 'Present' ) -and $matchingDatabaseNames.Count -eq 0 ) + { + $configurationInDesiredState = $false + Write-Verbose -Message ($script:localizedData.DatabasesNotFound -f ($DatabaseName -join ', ')) + } + else + { + $databasesNotFoundOnTheInstance = Get-DatabaseNamesNotFoundOnTheInstance -DatabaseName $DatabaseName -MatchingDatabaseNames $matchingDatabaseNames + + # If the databases specified are not present on the instance and the desired state is not Absent + if ( ( $databasesNotFoundOnTheInstance.Count -gt 0 ) -and ( $Ensure -ne 'Absent' ) ) + { + $configurationInDesiredState = $false + Write-Verbose -Message ($script:localizedData.DatabasesNotFound -f ( $databasesNotFoundOnTheInstance -join ', ' )) + } + + $getDatabasesToAddToAvailabilityGroupParameters = @{ + DatabaseName = $DatabaseName + Ensure = $Ensure + ServerObject = $primaryServerObject + AvailabilityGroup = $availabilityGroup + } + $databasesToAddToAvailabilityGroup = Get-DatabasesToAddToAvailabilityGroup @getDatabasesToAddToAvailabilityGroupParameters + + if ( $databasesToAddToAvailabilityGroup.Count -gt 0 ) + { + $configurationInDesiredState = $false + Write-Verbose -Message ($script:localizedData.DatabaseShouldBeMember -f $AvailabilityGroupName, ( $databasesToAddToAvailabilityGroup -join ', ' )) + } + + $getDatabasesToRemoveFromAvailabilityGroupParameters = @{ + DatabaseName = $DatabaseName + Ensure = $Ensure + Force = $Force + ServerObject = $primaryServerObject + AvailabilityGroup = $availabilityGroup + } + $databasesToRemoveFromAvailabilityGroup = Get-DatabasesToRemoveFromAvailabilityGroup @getDatabasesToRemoveFromAvailabilityGroupParameters + + if ( $databasesToRemoveFromAvailabilityGroup.Count -gt 0 ) + { + $configurationInDesiredState = $false + Write-Verbose -Message ($script:localizedData.DatabaseShouldNotBeMember -f $AvailabilityGroupName, ( $databasesToRemoveFromAvailabilityGroup -join ', ' )) + } + } + } + else + { + $configurationInDesiredState = $false + Write-Verbose -Message ($script:localizedData.AvailabilityGroupDoesNotExist -f ($DatabaseName -join ', ')) + } + + return $configurationInDesiredState +} + +<# + .SYNOPSIS + Get the databases that should be members of the Availability Group. + + .PARAMETER DatabaseName + The name of the database(s) to add to the availability group. This accepts wildcards. + + .PARAMETER Ensure + Specifies the membership of the database(s) in the availability group. The options are: + + - Present: The defined database(s) are added to the availability group. All other + databases that may be a member of the availability group are ignored. + - Absent: The defined database(s) are removed from the availability group. All other + databases that may be a member of the availability group are ignored. + + .PARAMETER ServerObject + The server object the databases should be in. + + .PARAMETER AvailabilityGroup + The availability group object the databases should be a member of. +#> +function Get-DatabasesToAddToAvailabilityGroup +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.String[]] + $DatabaseName, + + [Parameter(Mandatory = $true)] + [System.String] + $Ensure, + + [Parameter(Mandatory = $true)] + [Microsoft.SqlServer.Management.Smo.Server] + $ServerObject, + + [Parameter(Mandatory = $true)] + [Microsoft.SqlServer.Management.Smo.AvailabilityGroup] + $AvailabilityGroup + ) + + $matchingDatabaseNames = Get-MatchingDatabaseNames -DatabaseName $DatabaseName -ServerObject $ServerObject + + # This is a hack to allow Compare-Object to work on an empty object + if ( $null -eq $matchingDatabaseNames ) + { + $MatchingDatabaseNames = @('') + } + + $databasesInAvailabilityGroup = $AvailabilityGroup.AvailabilityDatabases | Select-Object -ExpandProperty Name + + # This is a hack to allow Compare-Object to work on an empty object + if ( $null -eq $databasesInAvailabilityGroup ) + { + $databasesInAvailabilityGroup = @('') + } + + $comparisonResult = Compare-Object -ReferenceObject $matchingDatabaseNames -DifferenceObject $databasesInAvailabilityGroup + $databasesToAddToAvailabilityGroup = @() + + if ( $Ensure -eq 'Present' ) + { + $databasesToAddToAvailabilityGroup = $comparisonResult | Where-Object -FilterScript { $_.SideIndicator -eq '<=' } | Select-Object -ExpandProperty InputObject + } + + return $databasesToAddToAvailabilityGroup +} + +<# + .SYNOPSIS + Get the databases that should not be members of the Availability Group. + + .PARAMETER DatabaseName + The name of the database(s) to add to the availability group. This accepts wildcards. + + .PARAMETER Ensure + Specifies the membership of the database(s) in the availability group. The options are: + + - Present: The defined database(s) are added to the availability group. All other + databases that may be a member of the availability group are ignored. + - Absent: The defined database(s) are removed from the availability group. All other + databases that may be a member of the availability group are ignored. + + .PARAMETER Force + When used with "Ensure = 'Present'" it ensures the specified database(s) are the only databases + that are a member of the specified Availability Group. + + This parameter is ignored when 'Ensure' is 'Absent'. + + .PARAMETER ServerObject + The server object the databases should not be in. + + .PARAMETER AvailabilityGroup + The availability group object the databases should not be a member of. +#> +function Get-DatabasesToRemoveFromAvailabilityGroup +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.String[]] + $DatabaseName, + + [Parameter(Mandatory = $true)] + [System.String] + $Ensure, + + [Parameter()] + [Boolean] + $Force, + + [Parameter(Mandatory = $true)] + [Microsoft.SqlServer.Management.Smo.Server] + $ServerObject, + + [Parameter(Mandatory = $true)] + [Microsoft.SqlServer.Management.Smo.AvailabilityGroup] + $AvailabilityGroup + ) + + $matchingDatabaseNames = Get-MatchingDatabaseNames -DatabaseName $DatabaseName -ServerObject $ServerObject + + + if ( $null -eq $matchingDatabaseNames ) + { + $MatchingDatabaseNames = @('') + } + + $databasesInAvailabilityGroup = $AvailabilityGroup.AvailabilityDatabases | Select-Object -ExpandProperty Name + + # This is a hack to allow Compare-Object to work on an empty object + if ( $null -eq $databasesInAvailabilityGroup ) + { + $databasesInAvailabilityGroup = @('') + } + + $comparisonResult = Compare-Object -ReferenceObject $matchingDatabaseNames -DifferenceObject $databasesInAvailabilityGroup -IncludeEqual + + $databasesToRemoveFromAvailabilityGroup = @() + + if ( 'Absent' -eq $Ensure ) + { + $databasesToRemoveFromAvailabilityGroup = $comparisonResult | Where-Object -FilterScript { '==' -eq $_.SideIndicator } | Select-Object -ExpandProperty InputObject + } + elseif ( ( 'Present' -eq $Ensure ) -and ( $Force ) ) + { + $databasesToRemoveFromAvailabilityGroup = $comparisonResult | Where-Object -FilterScript { '=>' -eq $_.SideIndicator } | Select-Object -ExpandProperty InputObject + } + + return $databasesToRemoveFromAvailabilityGroup +} + +<# + .SYNOPSIS + Get the database names that were specified in the configuration that do not exist on the instance. + + .PARAMETER DatabaseName + The name of the database(s) to add to the availability group. This accepts wildcards. + + .PARAMETER MatchingDatabaseNames + All of the databases names that match the supplied names and wildcards. +#> +function Get-MatchingDatabaseNames +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.String[]] + $DatabaseName, + + [Parameter(Mandatory = $true)] + [Microsoft.SqlServer.Management.Smo.Server] + $ServerObject + ) + + $matchingDatabaseNames = @() + + foreach ( $dbName in $DatabaseName ) + { + $matchingDatabaseNames += $ServerObject.Databases | Where-Object -FilterScript { $_.Name -like $dbName } | Select-Object -ExpandProperty Name + } + + return $matchingDatabaseNames +} + +<# + .SYNOPSIS + Get the database names that were defined in the DatabaseName property but were not found on the instance. + + .PARAMETER DatabaseName + The name of the database(s) to add to the availability group. This accepts wildcards. + + .PARAMETER MatchingDatabaseNames + All of the database names that were found on the instance that match the supplied DatabaseName property. +#> +function Get-DatabaseNamesNotFoundOnTheInstance +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.String[]] + $DatabaseName, + + [Parameter()] + [System.String[]] + $MatchingDatabaseNames + ) + + $databasesNotFoundOnTheInstance = @{} + foreach ( $dbName in $DatabaseName ) + { + # Assume the database name was not found + $databaseToAddToAvailabilityGroupNotFound = $true + + foreach ( $matchingDatabaseName in $matchingDatabaseNames ) + { + if ( $matchingDatabaseName -like $dbName ) + { + # If we found the database name, it's not missing + $databaseToAddToAvailabilityGroupNotFound = $false + } + } + + $databasesNotFoundOnTheInstance.Add($dbName, $databaseToAddToAvailabilityGroupNotFound) + } + + $result = $databasesNotFoundOnTheInstance.GetEnumerator() | Where-Object -FilterScript { $_.Value } | Select-Object -ExpandProperty Key + + return $result +} diff --git a/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.schema.mof b/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.schema.mof new file mode 100644 index 000000000..81ff59ecc --- /dev/null +++ b/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.schema.mof @@ -0,0 +1,14 @@ +[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerAOAGDatabaseMembership")] +class MSFT_xSQLServerAOAGDatabaseMembership : OMI_BaseResource +{ + [Required, Description("The name of the database(s) to add to the availability group. This accepts wildcards.")] String DatabaseName[]; + [Key, Description("Hostname of the SQL Server where the primary replica of the availability group lives. If the availability group is not currently on this server, the resource will attempt to connect to the server where the primary replica lives.")] String SQLServer; + [Key, Description("Name of the SQL instance to be configured.")] String SQLInstanceName; + [Key, Description("The name of the availability group in which to manage the database membership(s).")] String AvailabilityGroupName; + [Required, Description("The path used to seed the availability group replicas. This should be a path that is accessible by all of the replicas")] String BackupPath; + [Write, Description("Specifies the membership of the database(s) in the availability group. The options are: Present: The defined database(s) are added to the availability group. All other databases that may be a member of the availability group are ignored. Absent: The defined database(s) are removed from the availability group. All other databases that may be a member of the availability group are ignored. The default is 'Present'."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Write, Description("When used with 'Ensure = 'Present'' it ensures the specified database(s) are the only databases that are a member of the specified Availability Group. This parameter is ignored when 'Ensure' is 'Absent'.")] Boolean Force; + [Write, Description("If set to $true, this ensures the database owner of the database on the primary replica is the owner of the database on all secondary replicas. This requires the database owner is available as a login on all replicas and that the PSDscRunAsAccount has impersonate permissions. If set to $false, the owner of the database will be the PSDscRunAsAccount. The default is '$true'")] Boolean MatchDatabaseOwner; + [Write, Description("Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server Instance.")] Boolean ProcessOnlyOnActiveNode; + [Read, Description("Determines if the current node is actively hosting the SQL Server instance.")] Boolean IsActiveNode; +}; diff --git a/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/MSFT_xSQLServerAOAGDatabaseMembership.strings.psd1 b/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/MSFT_xSQLServerAOAGDatabaseMembership.strings.psd1 new file mode 100644 index 000000000..e6f7ca437 --- /dev/null +++ b/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/MSFT_xSQLServerAOAGDatabaseMembership.strings.psd1 @@ -0,0 +1,15 @@ +# Localized resources for xSQLServerAOAGDatabaseMembership + +ConvertFrom-StringData @' + AddingDatabasesToAvailabilityGroup = Adding the following databases to the '{0}' availability group: {1}. + AlterAvailabilityGroupDatabaseMembershipFailure = {0}. + AvailabilityGroupDoesNotExist = The availability group '{0}' does not exist. + DatabaseShouldBeMember = The following databases should be a member of the availability group '{0}': {1}. + DatabaseShouldNotBeMember = The following databases should not be a member of the availability group '{0}': {1}. + DatabasesNotFound = The following databases were not found in the instance: {0}. + ImpersonatePermissionsMissing = The login '{0}' is missing impersonate permissions in the instances '{1}'. + NotActiveNode = The node '{0}' is not actively hosting the instance '{1}'. Exiting the test. + ParameterNotOfType = The parameter '{0}' is not of the type '{1}'. + ParameterNullOrEmpty = The parameter '{0}' is NULL or empty. + RemovingDatabasesToAvailabilityGroup = Removing the following databases from the '{0}' availability group: {1}. +'@ diff --git a/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/about_xSQLServerAOAGDatabaseMembership.help.txt b/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/about_xSQLServerAOAGDatabaseMembership.help.txt new file mode 100644 index 000000000..eaab5b464 --- /dev/null +++ b/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/about_xSQLServerAOAGDatabaseMembership.help.txt @@ -0,0 +1,50 @@ +SYNOPSIS + Adds or removes databases to the specified availability group. + +PARAMETER DatabaseName + The name of the database(s) to add to the availability group. This accepts wildcards. + +PARAMETER SQLServer + Hostname of the SQL Server where the primary replica of the availability group lives. If the + availability group is not currently on this server, the resource will attempt to connect to the + server where the primary replica lives. + +PARAMETER SQLInstanceName + Name of the SQL instance where the primary replica of the availability group lives. If the + availability group is not currently on this instance, the resource will attempt to connect to + the instance where the primary replica lives. + +PARAMETER AvailabilityGroupName + The name of the availability group in which to manage the database membership(s). + +PARAMETER BackupPath + The path used to seed the availability group replicas. This should be a path that is accessible + by all of the replicas. + +PARAMETER Ensure + Specifies the membership of the database(s) in the availability group. The options are: + + - Present: The defined database(s) are added to the availability group. All other + databases that may be a member of the availability group are ignored. + - Absent: The defined database(s) are removed from the availability group. All other + databases that may be a member of the availability group are ignored. + + The default is 'Present'. + +PARAMETER Force + When used with "Ensure = 'Present'" it ensures the specified database(s) are the only databases + that are a member of the specified Availability Group. + + This parameter is ignored when 'Ensure' is 'Absent'. + +PARAMETER MatchDatabaseOwner + If set to $true, this ensures the database owner of the database on the primary replica is the + owner of the database on all secondary replicas. This requires the database owner is available + as a login on all replicas and that the PSDscRunAsCredential has impersonate permissions. + + If set to $false, the owner of the database will be the PSDscRunAsCredential. + + The default is '$true'. + +.PARAMETER ProcessOnlyOnActiveNode + Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server Instance. diff --git a/DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.psm1 b/DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.psm1 new file mode 100644 index 000000000..1aba2bbf2 --- /dev/null +++ b/DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.psm1 @@ -0,0 +1,709 @@ +Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` + -ChildPath 'xSQLServerHelper.psm1') ` + -Force + +<# + .SYNOPSIS + Gets the specified Availability Group Replica from the specified Availability Group. + + .PARAMETER Name + The name of the availability group replica. + + .PARAMETER AvailabilityGroupName + The name of the availability group. + + .PARAMETER SQLServer + Hostname of the SQL Server to be configured. + + .PARAMETER SQLInstanceName + Name of the SQL instance to be configued. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [String] + $AvailabilityGroupName, + + [Parameter(Mandatory = $true)] + [String] + $SQLServer, + + [Parameter(Mandatory = $true)] + [String] + $SQLInstanceName + ) + + # Connect to the instance + $serverObject = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName + + # Is this node actively hosting the SQL instance? + $isActiveNode = Test-ActiveNode -ServerObject $serverObject + + # Get the endpoint properties + $endpoint = $serverObject.Endpoints | Where-Object { $_.EndpointType -eq 'DatabaseMirroring' } + if ( $endpoint ) + { + $endpointPort = $endpoint.Protocol.Tcp.ListenerPort + } + + # Create the return object + $alwaysOnAvailabilityGroupReplicaResource = @{ + Ensure = 'Absent' + Name = '' + AvailabilityGroupName = '' + AvailabilityMode = '' + BackupPriority = '' + ConnectionModeInPrimaryRole = '' + ConnectionModeInSecondaryRole = '' + FailoverMode = '' + EndpointUrl = '' + IsActiveNode = $isActiveNode + ReadOnlyRoutingConnectionUrl = '' + ReadOnlyRoutingList = @() + SQLServer = $SQLServer + SQLInstanceName = $SQLInstanceName + EndpointPort = $endpointPort + SQLServerNetName = $serverObject.NetName + } + + # Get the availability group + $availabilityGroup = $serverObject.AvailabilityGroups[$AvailabilityGroupName] + + if ( $availabilityGroup ) + { + # Add the Availability Group name to the results + $alwaysOnAvailabilityGroupReplicaResource.AvailabilityGroupName = $availabilityGroup.Name + + # Try to find the replica + $availabilityGroupReplica = $availabilityGroup.AvailabilityReplicas[$Name] + + if ( $availabilityGroupReplica ) + { + # Add the Availability Group Replica properties to the results + $alwaysOnAvailabilityGroupReplicaResource.Ensure = 'Present' + $alwaysOnAvailabilityGroupReplicaResource.Name = $availabilityGroupReplica.Name + $alwaysOnAvailabilityGroupReplicaResource.AvailabilityMode = $availabilityGroupReplica.AvailabilityMode + $alwaysOnAvailabilityGroupReplicaResource.BackupPriority = $availabilityGroupReplica.BackupPriority + $alwaysOnAvailabilityGroupReplicaResource.ConnectionModeInPrimaryRole = $availabilityGroupReplica.ConnectionModeInPrimaryRole + $alwaysOnAvailabilityGroupReplicaResource.ConnectionModeInSecondaryRole = $availabilityGroupReplica.ConnectionModeInSecondaryRole + $alwaysOnAvailabilityGroupReplicaResource.FailoverMode = $availabilityGroupReplica.FailoverMode + $alwaysOnAvailabilityGroupReplicaResource.EndpointUrl = $availabilityGroupReplica.EndpointUrl + $alwaysOnAvailabilityGroupReplicaResource.ReadOnlyRoutingConnectionUrl = $availabilityGroupReplica.ReadOnlyRoutingConnectionUrl + $alwaysOnAvailabilityGroupReplicaResource.ReadOnlyRoutingList = $availabilityGroupReplica.ReadOnlyRoutingList + } + } + + return $alwaysOnAvailabilityGroupReplicaResource +} + +<# + .SYNOPSIS + Creates or removes the availability group replica in accordance with the desired state. + + .PARAMETER Name + The name of the availability group replica. + + .PARAMETER AvailabilityGroupName + The name of the availability group. + + .PARAMETER SQLServer + Hostname of the SQL Server to be configured. + + .PARAMETER SQLInstanceName + Name of the SQL instance to be configued. + + .PARAMETER PrimaryReplicaSQLServer + Hostname of the SQL Server where the primary replica is expected to be active. If the primary replica is not found here, the resource will attempt to find the host that holds the primary replica and connect to it. + + .PARAMETER PrimaryReplicaSQLInstanceName + Name of the SQL instance where the primary replica lives. + + .PARAMETER Ensure + Specifies if the availability group should be present or absent. Default is Present. + + .PARAMETER AvailabilityMode + Specifies the replica availability mode. Default is 'AsynchronousCommit'. + + .PARAMETER BackupPriority + Specifies the desired priority of the replicas in performing backups. The acceptable values for this parameter are integers from 0 through 100. Of the set of replicas which are online and available, the replica that has the highest priority performs the backup. Default is 50. + + .PARAMETER ConnectionModeInPrimaryRole + Specifies how the availability replica handles connections when in the primary role. + + .PARAMETER ConnectionModeInSecondaryRole + Specifies how the availability replica handles connections when in the secondary role. + + .PARAMETER EndpointHostName + Specifies the hostname or IP address of the availability group replica endpoint. Default is the instance network name which is set in the code because the value can only be determined when connected to the SQL Instance. + + .PARAMETER FailoverMode + Specifies the failover mode. Default is Manual. + + .PARAMETER ReadOnlyRoutingConnectionUrl + Specifies the fully-qualified domain name (FQDN) and port to use when routing to the replica for read only connections. + + .PARAMETER ReadOnlyRoutingList + Specifies an ordered list of replica server names that represent the probe sequence for connection director to use when redirecting read-only connections through this availability replica. This parameter applies if the availability replica is the current primary replica of the availability group. + + .PARAMETER ProcessOnlyOnActiveNode + Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server Instance. + Not used in Set-TargetResource. +#> +function Set-TargetResource +{ + [CmdletBinding()] + Param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [String] + $AvailabilityGroupName, + + [Parameter(Mandatory = $true)] + [String] + $SQLServer, + + [Parameter(Mandatory = $true)] + [String] + $SQLInstanceName, + + [Parameter()] + [String] + $PrimaryReplicaSQLServer, + + [Parameter()] + [String] + $PrimaryReplicaSQLInstanceName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [String] + $Ensure = 'Present', + + [Parameter()] + [ValidateSet('AsynchronousCommit', 'SynchronousCommit')] + [String] + $AvailabilityMode = 'AsynchronousCommit', + + [Parameter()] + [ValidateRange(0, 100)] + [UInt32] + $BackupPriority = 50, + + [Parameter()] + [ValidateSet('AllowAllConnections', 'AllowReadWriteConnections')] + [String] + $ConnectionModeInPrimaryRole, + + [Parameter()] + [ValidateSet('AllowNoConnections', 'AllowReadIntentConnectionsOnly', 'AllowAllConnections')] + [String] + $ConnectionModeInSecondaryRole, + + [Parameter()] + [String] + $EndpointHostName, + + [Parameter()] + [ValidateSet('Automatic', 'Manual')] + [String] + $FailoverMode = 'Manual', + + [Parameter()] + [String] + $ReadOnlyRoutingConnectionUrl, + + [Parameter()] + [String[]] + $ReadOnlyRoutingList, + + [Parameter()] + [Boolean] + $ProcessOnlyOnActiveNode + ) + + Import-SQLPSModule + + # Connect to the instance + $serverObject = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName + + # Determine if HADR is enabled on the instance. If not, throw an error + if ( -not $serverObject.IsHadrEnabled ) + { + throw New-TerminatingError -ErrorType HadrNotEnabled -FormatArgs $Ensure, $SQLInstanceName -ErrorCategory NotImplemented + } + + # Get the Availability Group if it exists + $availabilityGroup = $serverObject.AvailabilityGroups[$AvailabilityGroupName] + + # Make sure we're communicating with the primary replica in order to make changes to the replica + if ( $availabilityGroup ) + { + while ( $availabilityGroup.LocalReplicaRole -ne 'Primary' ) + { + $primaryServerObject = Get-PrimaryReplicaServerObject -ServerObject $serverObject -AvailabilityGroup $availabilityGroup + $availabilityGroup = $primaryServerObject.AvailabilityGroups[$AvailabilityGroupName] + } + } + + switch ( $Ensure ) + { + Absent + { + if ( $availabilityGroup ) + { + $availabilityGroupReplica = $availabilityGroup.AvailabilityReplicas[$Name] + + if ( $availabilityGroupReplica ) + { + try + { + Remove-SqlAvailabilityReplica -InputObject $availabilityGroupReplica -Confirm:$false -ErrorAction Stop + } + catch + { + throw New-TerminatingError -ErrorType RemoveAvailabilityGroupReplicaFailed -FormatArgs $Name -ErrorCategory ResourceUnavailable -InnerException $_.Exception + } + } + } + } + + Present + { + # Ensure the appropriate cluster permissions are present + Test-ClusterPermissions -ServerObject $serverObject + + # Make sure a database mirroring endpoint exists. + $endpoint = $serverObject.Endpoints | Where-Object { $_.EndpointType -eq 'DatabaseMirroring' } + if ( -not $endpoint ) + { + throw New-TerminatingError -ErrorType DatabaseMirroringEndpointNotFound -FormatArgs $SQLServer, $SQLInstanceName -ErrorCategory ObjectNotFound + } + + # If a hostname for the endpoint was not specified, define it now. + if ( -not $EndpointHostName ) + { + $EndpointHostName = $serverObject.NetName + } + + # Get the endpoint port + $endpointPort = $endpoint.Protocol.Tcp.ListenerPort + + # Determine if the Availability Group exists on the instance + if ( $availabilityGroup ) + { + # Make sure the replia exists on the instance. If the availability group exists, the replica should exist. + $availabilityGroupReplica = $availabilityGroup.AvailabilityReplicas[$Name] + if ( $availabilityGroupReplica ) + { + if ( $AvailabilityMode -ne $availabilityGroupReplica.AvailabilityMode ) + { + $availabilityGroupReplica.AvailabilityMode = $AvailabilityMode + Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica + } + + if ( $BackupPriority -ne $availabilityGroupReplica.BackupPriority ) + { + $availabilityGroupReplica.BackupPriority = $BackupPriority + Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica + } + + # Make sure ConnectionModeInPrimaryRole has a value in order to avoid false positive matches when the parameter is not defined + if ( ( -not [string]::IsNullOrEmpty($ConnectionModeInPrimaryRole) ) -and ( $ConnectionModeInPrimaryRole -ne $availabilityGroupReplica.ConnectionModeInPrimaryRole ) ) + { + $availabilityGroupReplica.ConnectionModeInPrimaryRole = $ConnectionModeInPrimaryRole + Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica + } + + # Make sure ConnectionModeInSecondaryRole has a value in order to avoid false positive matches when the parameter is not defined + if ( ( -not [string]::IsNullOrEmpty($ConnectionModeInSecondaryRole) ) -and ( $ConnectionModeInSecondaryRole -ne $availabilityGroupReplica.ConnectionModeInSecondaryRole ) ) + { + $availabilityGroupReplica.ConnectionModeInSecondaryRole = $ConnectionModeInSecondaryRole + Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica + } + + # Break out the EndpointUrl properties + $currentEndpointProtocol, $currentEndpointHostName, $currentEndpointPort = $availabilityGroupReplica.EndpointUrl.Replace('//', '').Split(':') + + if ( $endpoint.Protocol.Tcp.ListenerPort -ne $currentEndpointPort ) + { + $newEndpointUrl = $availabilityGroupReplica.EndpointUrl.Replace($currentEndpointPort, $endpoint.Protocol.Tcp.ListenerPort) + $availabilityGroupReplica.EndpointUrl = $newEndpointUrl + Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica + } + + if ( $EndpointHostName -ne $currentEndpointHostName ) + { + $newEndpointUrl = $availabilityGroupReplica.EndpointUrl.Replace($currentEndpointHostName, $EndpointHostName) + $availabilityGroupReplica.EndpointUrl = $newEndpointUrl + Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica + } + + if ( $currentEndpointProtocol -ne 'TCP' ) + { + $newEndpointUrl = $availabilityGroupReplica.EndpointUrl.Replace($currentEndpointProtocol, 'TCP') + $availabilityGroupReplica.EndpointUrl = $newEndpointUrl + Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica + } + + if ( $FailoverMode -ne $availabilityGroupReplica.FailoverMode ) + { + $availabilityGroupReplica.FailoverMode = $FailoverMode + Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica + } + + if ( $ReadOnlyRoutingConnectionUrl -ne $availabilityGroupReplica.ReadOnlyRoutingConnectionUrl ) + { + $availabilityGroupReplica.ReadOnlyRoutingConnectionUrl = $ReadOnlyRoutingConnectionUrl + Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica + } + + if ( $ReadOnlyRoutingList -ne $availabilityGroupReplica.ReadOnlyRoutingList ) + { + $availabilityGroupReplica.ReadOnlyRoutingList = $ReadOnlyRoutingList + Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica + } + } + else + { + throw New-TerminatingError -ErrorType ReplicaNotFound -FormatArgs $Name, $SQLInstanceName -ErrorCategory ResourceUnavailable + } + } + else + { + # Connect to the instance that is supposed to house the primary replica + $primaryReplicaServerObject = Connect-SQL -SQLServer $PrimaryReplicaSQLServer -SQLInstanceName $PrimaryReplicaSQLInstanceName + + # Verify the Availability Group exists on the supplied primary replica + $primaryReplicaAvailabilityGroup = $primaryReplicaServerObject.AvailabilityGroups[$AvailabilityGroupName] + if ( $primaryReplicaAvailabilityGroup ) + { + # Make sure the instance defined as the primary replica in the parameters is actually the primary replica + $primaryReplicaServerObject = Get-PrimaryReplicaServerObject -ServerObject $primaryReplicaServerObject -AvailabilityGroup $primaryReplicaAvailabilityGroup + $availabilityGroup = $primaryReplicaServerObject.AvailabilityGroups[$AvailabilityGroupName] + + # Build the endpoint URL + $endpointUrl = "TCP://$($EndpointHostName):$($endpointPort)" + + $newAvailabilityGroupReplicaParams = @{ + Name = $Name + InputObject = $primaryReplicaAvailabilityGroup + AvailabilityMode = $AvailabilityMode + EndpointUrl = $endpointUrl + FailoverMode = $FailoverMode + Verbose = $false + } + + if ( $BackupPriority ) + { + $newAvailabilityGroupReplicaParams.Add('BackupPriority', $BackupPriority) + } + + if ( $ConnectionModeInPrimaryRole ) + { + $newAvailabilityGroupReplicaParams.Add('ConnectionModeInPrimaryRole', $ConnectionModeInPrimaryRole) + } + + if ( $ConnectionModeInSecondaryRole ) + { + $newAvailabilityGroupReplicaParams.Add('ConnectionModeInSecondaryRole', $ConnectionModeInSecondaryRole) + } + + if ( $ReadOnlyRoutingConnectionUrl ) + { + $newAvailabilityGroupReplicaParams.Add('ReadOnlyRoutingConnectionUrl', $ReadOnlyRoutingConnectionUrl) + } + + if ( $ReadOnlyRoutingList ) + { + $newAvailabilityGroupReplicaParams.Add('ReadOnlyRoutingList', $ReadOnlyRoutingList) + } + + # Create the Availability Group Replica + try + { + $availabilityGroupReplica = New-SqlAvailabilityReplica @newAvailabilityGroupReplicaParams + } + catch + { + throw New-TerminatingError -ErrorType CreateAvailabilityGroupReplicaFailed -FormatArgs $Name, $SQLInstanceName -ErrorCategory OperationStopped -InnerException $_.Exception + } + + # Join the Availability Group Replica to the Availability Group + try + { + $joinAvailabilityGroupResults = Join-SqlAvailabilityGroup -Name $AvailabilityGroupName -InputObject $serverObject + } + catch + { + throw New-TerminatingError -ErrorType JoinAvailabilityGroupFailed -FormatArgs $Name -ErrorCategory OperationStopped -InnerException $_.Exception + } + } + # The Availability Group doesn't exist on the primary replica + else + { + throw New-TerminatingError -ErrorType AvailabilityGroupNotFound -FormatArgs $AvailabilityGroupName, $PrimaryReplicaSQLInstanceName -ErrorCategory ResourceUnavailable + } + } + } + } +} + +<# + .SYNOPSIS + Determines if the availability group replica is in the desired state. + + .PARAMETER Name + The name of the availability group replica. + + .PARAMETER AvailabilityGroupName + The name of the availability group. + + .PARAMETER SQLServer + Hostname of the SQL Server to be configured. + + .PARAMETER SQLInstanceName + Name of the SQL instance to be configued. + + .PARAMETER PrimaryReplicaSQLServer + Hostname of the SQL Server where the primary replica is expected to be active. If the primary replica is not found here, the resource will attempt to find the host that holds the primary replica and connect to it. + + .PARAMETER PrimaryReplicaSQLInstanceName + Name of the SQL instance where the primary replica lives. + + .PARAMETER Ensure + Specifies if the availability group should be present or absent. Default is Present. + + .PARAMETER AvailabilityMode + Specifies the replica availability mode. Default is 'AsynchronousCommit'. + + .PARAMETER BackupPriority + Specifies the desired priority of the replicas in performing backups. The acceptable values for this parameter are integers from 0 through 100. Of the set of replicas which are online and available, the replica that has the highest priority performs the backup. Default is 50. + + .PARAMETER ConnectionModeInPrimaryRole + Specifies how the availability replica handles connections when in the primary role. + + .PARAMETER ConnectionModeInSecondaryRole + Specifies how the availability replica handles connections when in the secondary role. + + .PARAMETER EndpointHostName + Specifies the hostname or IP address of the availability group replica endpoint. Default is the instance network name which is set in the code because the value can only be determined when connected to the SQL Instance. + + .PARAMETER FailoverMode + Specifies the failover mode. Default is Manual. + + .PARAMETER ReadOnlyRoutingConnectionUrl + Specifies the fully-qualified domain name (FQDN) and port to use when routing to the replica for read only connections. + + .PARAMETER ReadOnlyRoutingList + Specifies an ordered list of replica server names that represent the probe sequence for connection director to use when redirecting read-only connections through this availability replica. This parameter applies if the availability replica is the current primary replica of the availability group. + + .PARAMETER ProcessOnlyOnActiveNode + Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server Instance. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + Param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [String] + $AvailabilityGroupName, + + [Parameter(Mandatory = $true)] + [String] + $SQLServer, + + [Parameter(Mandatory = $true)] + [String] + $SQLInstanceName, + + [Parameter()] + [String] + $PrimaryReplicaSQLServer, + + [Parameter()] + [String] + $PrimaryReplicaSQLInstanceName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [String] + $Ensure = 'Present', + + [Parameter()] + [ValidateSet('AsynchronousCommit', 'SynchronousCommit')] + [String] + $AvailabilityMode = 'AsynchronousCommit', + + [Parameter()] + [ValidateRange(0, 100)] + [UInt32] + $BackupPriority = 50, + + [Parameter()] + [ValidateSet('AllowAllConnections', 'AllowReadWriteConnections')] + [String] + $ConnectionModeInPrimaryRole, + + [Parameter()] + [ValidateSet('AllowNoConnections', 'AllowReadIntentConnectionsOnly', 'AllowAllConnections')] + [String] + $ConnectionModeInSecondaryRole, + + [Parameter()] + [String] + $EndpointHostName, + + [Parameter()] + [ValidateSet('Automatic', 'Manual')] + [String] + $FailoverMode = 'Manual', + + [Parameter()] + [String] + $ReadOnlyRoutingConnectionUrl, + + [Parameter()] + [String[]] + $ReadOnlyRoutingList, + + [Parameter()] + [Boolean] + $ProcessOnlyOnActiveNode + ) + + $getTargetResourceParameters = @{ + SQLInstanceName = $SQLInstanceName + SQLServer = $SQLServer + Name = $Name + AvailabilityGroupName = $AvailabilityGroupName + } + + # Assume this will pass. We will determine otherwise later + $result = $true + + $getTargetResourceResult = Get-TargetResource @getTargetResourceParameters + + <# + If this is supposed to process only the active node, and this is not the + active node, don't bother evaluating the test. + #> + if ( $ProcessOnlyOnActiveNode -and -not $getTargetResourceResult.IsActiveNode ) + { + # Use localization if the resource has been converted + New-VerboseMessage -Message ( 'The node "{0}" is not actively hosting the instance "{1}". Exiting the test.' -f $env:COMPUTERNAME,$SQLInstanceName ) + return $result + } + + switch ($Ensure) + { + 'Absent' + { + if ( $getTargetResourceResult.Ensure -eq 'Absent' ) + { + $result = $true + } + else + { + $result = $false + } + } + + 'Present' + { + $parametersToCheck = @( + 'Name', + 'AvailabilityGroupName', + 'SQLServer', + 'SQLInstanceName', + 'Ensure', + 'AvailabilityMode', + 'BackupPriority', + 'ConnectionModeInPrimaryRole', + 'ConnectionModeInSecondaryRole', + 'FailoverMode', + 'ReadOnlyRoutingConnectionUrl', + 'ReadOnlyRoutingList' + ) + + if ( $getTargetResourceResult.Ensure -eq 'Present' ) + { + # PsBoundParameters won't work here because it doesn't account for default values + foreach ( $parameter in $MyInvocation.MyCommand.Parameters.GetEnumerator() ) + { + $parameterName = $parameter.Key + $parameterValue = Get-Variable -Name $parameterName -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Value + + # Make sure we don't try to validate a common parameter + if ( $parametersToCheck -contains $parameterName ) + { + # If the parameter is Null, a value wasn't provided + if ( -not [string]::IsNullOrEmpty($parameterValue) ) + { + if ( $getTargetResourceResult.($parameterName) -ne $parameterValue ) + { + New-VerboseMessage -Message "'$($parameterName)' should be '$($parameterValue)' but is '$($getTargetResourceResult.($parameterName))'" + + $result = $false + } + } + } + } + + # Get the Endpoint URL properties + $currentEndpointProtocol, $currentEndpointHostName, $currentEndpointPort = $getTargetResourceResult.EndpointUrl.Replace('//', '').Split(':') + + if ( -not $EndpointHostName ) + { + $EndpointHostName = $getTargetResourceResult.SQLServerNetName + } + + # Verify the hostname in the endpoint URL is correct + if ( $EndpointHostName -ne $currentEndpointHostName ) + { + New-VerboseMessage -Message "'EndpointHostName' should be '$EndpointHostName' but is '$currentEndpointHostName'" + $result = $false + } + + # Verify the protocol in the endpoint URL is correct + if ( 'TCP' -ne $currentEndpointProtocol ) + { + New-VerboseMessage -Message "'EndpointProtocol' should be 'TCP' but is '$currentEndpointProtocol'" + $result = $false + } + + # Verify the port in the endpoint URL is correct + if ( $getTargetResourceResult.EndpointPort -ne $currentEndpointPort ) + { + New-VerboseMessage -Message "'EndpointPort' should be '$($getTargetResourceResult.EndpointPort)' but is '$currentEndpointPort'" + $result = $false + } + } + else + { + $result = $false + } + } + } + + return $result +} + +Export-ModuleMember -Function *-TargetResource diff --git a/DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.schema.mof b/DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.schema.mof new file mode 100644 index 000000000..6b9a4d5b0 --- /dev/null +++ b/DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.schema.mof @@ -0,0 +1,24 @@ +[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerAOAGReplica")] +class MSFT_xSQLServerAOAGReplica : OMI_BaseResource +{ + [Key, Description("The name of the availability group replica. For named instances this must be in the following format SQLServer\\InstanceName.")] String Name; + [Key, Description("The name of the availability group.")] String AvailabilityGroupName; + [Required, Description("Hostname of the SQL Server to be configured.")] String SQLServer; + [Key, Description("Name of the SQL instance to be configured.")] String SQLInstanceName; + [Write, Description("Hostname of the SQL Server where the primary replica is expected to be active. If the primary replica is not found here, the resource will attempt to find the host that holds the primary replica and connect to it.")] String PrimaryReplicaSQLServer; + [Write, Description("Name of the SQL instance where the primary replica lives.")] String PrimaryReplicaSQLInstanceName; + [Write, Description("Specifies if the availability group replica should be present or absent. Default is Present."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Write, Description("Specifies the replica availability mode. Default is 'AsynchronousCommit'."), ValueMap{"AsynchronousCommit","SynchronousCommit"}, Values{"AsynchronousCommit","SynchronousCommit"}] String AvailabilityMode; + [Write, Description("Specifies the desired priority of the replicas in performing backups. The acceptable values for this parameter are: integers from 0 through 100. Of the set of replicas which are online and available, the replica that has the highest priority performs the backup. Default is 50.")] UInt32 BackupPriority; + [Write, Description("Specifies how the availability replica handles connections when in the primary role."), ValueMap{"AllowAllConnections","AllowReadWriteConnections"}, Values{"AllowAllConnections","AllowReadWriteConnections"}] String ConnectionModeInPrimaryRole; + [Write, Description("Specifies how the availability replica handles connections when in the secondary role."), ValueMap{"AllowNoConnections","AllowReadIntentConnectionsOnly","AllowAllConnections"}, Values{"AllowNoConnections","AllowReadIntentConnectionsOnly","AllowAllConnections"}] String ConnectionModeInSecondaryRole; + [Write, Description("Specifies the hostname or IP address of the availability group replica endpoint. Default is the instance network name which is set in the code because the value can only be determined when connected to the SQL Instance.")] String EndpointHostName; + [Write, Description("Specifies the failover mode. Default is 'Manual'."), ValueMap{"Automatic","Manual"}, Values{"Automatic","Manual"}] String FailoverMode; + [Write, Description("Specifies the fully-qualified domain name (FQDN) and port to use when routing to the replica for read only connections.")] String ReadOnlyRoutingConnectionUrl; + [Write, Description("Specifies an ordered list of replica server names that represent the probe sequence for connection director to use when redirecting read-only connections through this availability replica. This parameter applies if the availability replica is the current primary replica of the availability group.")] String ReadOnlyRoutingList[]; + [Write, Description("Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server instance.")] Boolean ProcessOnlyOnActiveNode; + [Read, Description("Output the network port the endpoint is listening on. Used by Get-TargetResource.")] Uint16 EndpointPort; + [Read, Description("Output the endpoint URL of the Availability Group Replica. Used by Get-TargetResource.")] String EndpointUrl; + [Read, Description("Output the NetName property from the SQL Server object. Used by Get-TargetResource.")] String SqlServerNetName; + [Read, Description("Determines if the current node is actively hosting the SQL Server instance.")] Boolean IsActiveNode; +}; From 3f2999805bb68966aa5eea0a898f2e9317d448d2 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 2 Nov 2017 12:26:09 -0500 Subject: [PATCH 26/42] Reduce file path across resources --- xSQLServer.zip | Bin 0 -> 404541 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 xSQLServer.zip diff --git a/xSQLServer.zip b/xSQLServer.zip new file mode 100644 index 0000000000000000000000000000000000000000..7b08f7ccc03ced0f0c61977f0675e3aa800d4723 GIT binary patch literal 404541 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 z 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%0D#$1008Fy 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 i$=~Uuwe9Z;-!^r_lY6}t$|y-c Date: Thu, 2 Nov 2017 18:22:18 -0500 Subject: [PATCH 27/42] first pass at complete rename --- CHANGELOG.md | 3 + DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1 | 2 +- .../MSFT_SqlAG.psm1~HEAD} | 2 +- .../MSFT_xSqlAG.schema.mof} | 4 +- .../MSFT_SqlAGDatabases.psm1} | 4 +- .../MSFT_SqlAGDatabases.schema.mof} | 4 +- .../en-US/MSFT_SqlAGDatabases.strings.psd1} | 2 +- .../en-US/about_SqlAGDatabases.help.txt} | 0 .../MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1 | 2 +- .../MSFT_SqlAGReplica.psm1~HEAD} | 2 +- .../MSFT_SqlServerServiceAccount.psm1 | 367 ++++ .../MSFT_SqlServerServiceAccount.schema.mof | 10 + ...MSFT_xSQLServerServiceAccount.strings.psd1 | 11 + .../MSFT_SqlWaitForAvailabilityGroup.psm1 | 175 ++ ...SFT_SqlWaitForAvailabilityGroup.schema.mof | 8 + .../MSFT_xSQLServerAOAGReplica.schema.mof | 24 - .../1-AddDatabasesToAvailabilityGroup.ps1 | 120 ++ ...2-RemoveDatabasesFromAvailabilityGroup.ps1 | 114 ++ ...tchDefinedDatabasesInAvailabilityGroup.ps1 | 115 ++ .../1-ConfigureServiceAccount-UserAccount.ps1 | 27 + ...ConfigureServiceAccount-VirtualAccount.ps1 | 31 + .../1-WaitForASingleClusterGroup.ps1 | 28 + .../2-WaitForMultipleClusterGroups.ps1 | 37 + SQLServerDsc.psd1 | 45 +- SqlServerDscHelper.psm1 | 2 +- .../MSFT_SqlAlwaysOnService.config.ps1 | 8 + ...MSFT_SqlDatabaseDefaultLocation.config.ps1 | 8 + Tests/SqlServerDscCommon.Tests.ps1 | 6 +- Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 | 1530 +++++++++++++++++ Tests/Unit/MSFT_SqlAGListener.Tests.ps1 | 12 + .../MSFT_SqlServerServiceAccount.Tests.ps1 | 731 ++++++++ ...MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 | 244 +++ en-US/SqlServerDscHelper.strings.psd1 | 2 +- sv-SE/SqlServerDscHelper.strings.psd1 | 2 +- xSQLServer.zip | Bin 404541 -> 0 bytes 35 files changed, 3639 insertions(+), 43 deletions(-) rename DSCResources/{MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.psm1 => MSFT_SqlAG/MSFT_SqlAG.psm1~HEAD} (99%) rename DSCResources/{MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.schema.mof => MSFT_SqlAG/MSFT_xSqlAG.schema.mof} (97%) rename DSCResources/{MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.psm1 => MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1} (99%) rename DSCResources/{MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.schema.mof => MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.schema.mof} (94%) rename DSCResources/{MSFT_xSQLServerAOAGDatabaseMembership/en-US/MSFT_xSQLServerAOAGDatabaseMembership.strings.psd1 => MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1} (94%) rename DSCResources/{MSFT_xSQLServerAOAGDatabaseMembership/en-US/about_xSQLServerAOAGDatabaseMembership.help.txt => MSFT_SqlAGDatabases/en-US/about_SqlAGDatabases.help.txt} (100%) rename DSCResources/{MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.psm1 => MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1~HEAD} (99%) create mode 100644 DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.psm1 create mode 100644 DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.schema.mof create mode 100644 DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_xSQLServerServiceAccount.strings.psd1 create mode 100644 DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.psm1 create mode 100644 DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.schema.mof delete mode 100644 DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.schema.mof create mode 100644 Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 create mode 100644 Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 create mode 100644 Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 create mode 100644 Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 create mode 100644 Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 create mode 100644 Examples/Resources/SqlWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1 create mode 100644 Examples/Resources/SqlWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1 create mode 100644 Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 create mode 100644 Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 create mode 100644 Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 delete mode 100644 xSQLServer.zip diff --git a/CHANGELOG.md b/CHANGELOG.md index 402143629..8b635d7c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ ## 9.0.0.0 +- Significant rename to reduce length of Resource names + - BREAKING CHANGE + - Impact to all resources - Changes to xSQLServer - Updated Pester syntax to v4 - Fixes broken links to issues in the CHANGELOG.md. diff --git a/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1 b/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1 index e5154e69f..5997d0b69 100644 --- a/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1 +++ b/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDscHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# diff --git a/DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.psm1 b/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1~HEAD similarity index 99% rename from DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.psm1 rename to DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1~HEAD index 1c87a2bb6..e5154e69f 100644 --- a/DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.psm1 +++ b/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1~HEAD @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# diff --git a/DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.schema.mof b/DSCResources/MSFT_SqlAG/MSFT_xSqlAG.schema.mof similarity index 97% rename from DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.schema.mof rename to DSCResources/MSFT_SqlAG/MSFT_xSqlAG.schema.mof index 521516263..487516fd8 100644 --- a/DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.schema.mof +++ b/DSCResources/MSFT_SqlAG/MSFT_xSqlAG.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerAOAG")] -class MSFT_xSQLServerAOAG : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlAG")] +class MSFT_SqlAG : OMI_BaseResource { [Key, Description("The name of the availability group.")] String Name; [Required, Description("Hostname of the SQL Server to be configured.")] String SQLServer; diff --git a/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.psm1 b/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.psm1 rename to DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 index b86c1a5aa..87e68014a 100644 --- a/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.psm1 +++ b/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 @@ -1,11 +1,11 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` -ChildPath 'CommonResourceHelper.psm1') -$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_xSQLServerAOAGDatabaseMembership' +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlServerAGDatabaseMembership' <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.schema.mof b/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.schema.mof similarity index 94% rename from DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.schema.mof rename to DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.schema.mof index 81ff59ecc..795e6c729 100644 --- a/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.schema.mof +++ b/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerAOAGDatabaseMembership")] -class MSFT_xSQLServerAOAGDatabaseMembership : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlAGDatabases")] +class MSFT_SqlAGDatabases : OMI_BaseResource { [Required, Description("The name of the database(s) to add to the availability group. This accepts wildcards.")] String DatabaseName[]; [Key, Description("Hostname of the SQL Server where the primary replica of the availability group lives. If the availability group is not currently on this server, the resource will attempt to connect to the server where the primary replica lives.")] String SQLServer; diff --git a/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/MSFT_xSQLServerAOAGDatabaseMembership.strings.psd1 b/DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 similarity index 94% rename from DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/MSFT_xSQLServerAOAGDatabaseMembership.strings.psd1 rename to DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 index e6f7ca437..874289645 100644 --- a/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/MSFT_xSQLServerAOAGDatabaseMembership.strings.psd1 +++ b/DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 @@ -1,4 +1,4 @@ -# Localized resources for xSQLServerAOAGDatabaseMembership +# Localized resources for SqlServerAGDatabaseMembership ConvertFrom-StringData @' AddingDatabasesToAvailabilityGroup = Adding the following databases to the '{0}' availability group: {1}. diff --git a/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/about_xSQLServerAOAGDatabaseMembership.help.txt b/DSCResources/MSFT_SqlAGDatabases/en-US/about_SqlAGDatabases.help.txt similarity index 100% rename from DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/about_xSQLServerAOAGDatabaseMembership.help.txt rename to DSCResources/MSFT_SqlAGDatabases/en-US/about_SqlAGDatabases.help.txt diff --git a/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1 b/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1 index 2117f87b2..1a4c4e17c 100644 --- a/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1 +++ b/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDscHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# diff --git a/DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.psm1 b/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1~HEAD similarity index 99% rename from DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.psm1 rename to DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1~HEAD index 1aba2bbf2..2117f87b2 100644 --- a/DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.psm1 +++ b/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1~HEAD @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# diff --git a/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.psm1 b/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.psm1 new file mode 100644 index 000000000..76b247cc3 --- /dev/null +++ b/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.psm1 @@ -0,0 +1,367 @@ +Import-Module -Name (Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) ` + -ChildPath 'SqlServerDSCHelper.psm1') + +Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` + -ChildPath 'CommonResourceHelper.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlServerServiceAccount' + +<# + .SYNOPSIS + Gets the service account for the specified instance. + + .PARAMETER SQLServer + Host name of the SQL Server to manage. + + .PARAMETER SQLInstanceName + Name of the SQL instance. + + .PARAMETER ServiceType + Type of service to be managed. Must be one of the following: + DatabaseEngine, SQLServerAgent, Search, IntegrationServices, AnalysisServices, ReportingServices, SQLServerBrowser, NotificationServices. + + .PARAMETER ServiceAccount + ** Not used in this function ** + Credential of the service account that should be used. + + .EXAMPLE + Get-TargetResource -SQLServer $env:COMPUTERNAME -SQLInstanceName MSSQLSERVER -ServiceType SqlServer -ServiceAccount $account +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $SQLServer, + + [Parameter(Mandatory = $true)] + [System.String] + $SQLInstanceName, + + [Parameter(Mandatory = $true)] + [ValidateSet('DatabaseEngine', 'SQLServerAgent', 'Search', 'IntegrationServices', 'AnalysisServices', 'ReportingServices', 'SQLServerBrowser', 'NotificationServices')] + [System.String] + $ServiceType, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $ServiceAccount + ) + + # Get the SMO Service object instance + $serviceObject = Get-ServiceObject -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName -ServiceType $ServiceType + + # If no service was found, throw an exception + if (-not $serviceObject) + { + $errorMessage = $script:localizedData.ServiceNotFound -f $ServiceType, $SQLServer, $SQLInstanceName + New-ObjectNotFoundException -Message $errorMessage + } + + # Local accounts will start with a '.' + # Replace a domain of '.' with the value for $SQLServer + $serviceAccountName = $serviceObject.ServiceAccount -ireplace '^([\.])\\(.*)$', "$SQLServer\`$2" + + # Return a hashtable with the service information + return @{ + SQLServer = $SQLServer + SQLInstanceName = $SQLInstanceName + ServiceType = $serviceObject.Type + ServiceAccount = $serviceAccountName + } +} + +<# + .SYNOPSIS + Tests whether the specified instance's service account is correctly configured. + + .PARAMETER SQLServer + Host name of the SQL Server to manage. + + .PARAMETER SQLInstanceName + Name of the SQL instance. + + .PARAMETER ServiceType + Type of service to be managed. Must be one of the following: + DatabaseEngine, SQLServerAgent, Search, IntegrationServices, AnalysisServices, ReportingServices, SQLServerBrowser, NotificationServices. + + .PARAMETER ServiceAccount + Credential of the service account that should be used. + + .PARAMETER RestartService + Determines whether the service is automatically restarted. + + .PARAMETER Force + Forces the service account to be updated. + + .EXAMPLE + Test-TargetResource -SQLServer $env:COMPUTERNAME -SQLInstaneName MSSQLSERVER -ServiceType SqlServer -ServiceAccount $account + +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $SQLServer, + + [Parameter(Mandatory = $true)] + [System.String] + $SQLInstanceName, + + [Parameter(Mandatory = $true)] + [ValidateSet('DatabaseEngine', 'SQLServerAgent', 'Search', 'IntegrationServices', 'AnalysisServices', 'ReportingServices', 'SQLServerBrowser', 'NotificationServices')] + [System.String] + $ServiceType, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $ServiceAccount, + + [Parameter()] + [System.Boolean] + $RestartService, + + [Parameter()] + [System.Boolean] + $Force + ) + + if ($Force) + { + New-VerboseMessage -Message $script:localizedData.ForceServiceAccountUpdate + return $false + } + + # Get the current state + $currentState = Get-TargetResource -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName -ServiceType $ServiceType -ServiceAccount $ServiceAccount + New-VerboseMessage -Message ($script:localizedData.CurrentServiceAccount -f $currentState.ServiceAccount, $SQLServer, $SQLInstanceName) + + return ($currentState.ServiceAccount -ieq $ServiceAccount.UserName) +} + +<# + .SYNOPSIS + Sets the SQL Server service account to the desired state. + + .PARAMETER SQLServer + Host name of the SQL Server to manage. + + .PARAMETER SQLInstanceName + Name of the SQL instance. + + .PARAMETER ServiceType + Type of service to be managed. Must be one of the following: + DatabaseEngine, SQLServerAgent, Search, IntegrationServices, AnalysisServices, ReportingServices, SQLServerBrowser, NotificationServices. + + .PARAMETER ServiceAccount + Credential of the service account that should be used. + + .PARAMETER RestartService + Determines whether the service is automatically restarted. + + .PARAMETER Force + Forces the service account to be updated. + + .EXAMPLE + Set-TargetResource -SQLServer $env:COMPUTERNAME -SQLInstaneName MSSQLSERVER -ServiceType SqlServer -ServiceAccount $account +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $SQLServer, + + [Parameter(Mandatory = $true)] + [System.String] + $SQLInstanceName, + + [Parameter(Mandatory = $true)] + [ValidateSet('DatabaseEngine', 'SQLServerAgent', 'Search', 'IntegrationServices', 'AnalysisServices', 'ReportingServices', 'SQLServerBrowser', 'NotificationServices')] + [System.String] + $ServiceType, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $ServiceAccount, + + [Parameter()] + [System.Boolean] + $RestartService, + + [Parameter()] + [System.Boolean] + $Force + ) + + # Get the Service object + $serviceObject = Get-ServiceObject -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName -ServiceType $ServiceType + + # If no service was found, throw an exception + if (-not $serviceObject) + { + $errorMessage = $script:localizedData.ServiceNotFound -f $ServiceType, $SQLServer, $SQLInstanceName + New-ObjectNotFoundException -Message $errorMessage + } + + try + { + New-VerboseMessage -Message ($script:localizedData.UpdatingServiceAccount -f $ServiceAccount.UserName, $serviceObject.Name) + $serviceObject.SetServiceAccount($ServiceAccount.UserName, $ServiceAccount.GetNetworkCredential().Password) + } + catch + { + $errorMessage = $script:localizedData.SetServiceAccountFailed -f $SQLServer, $SQLInstanceName, $_.Message + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + + if ($RestartService) + { + New-VerboseMessage -Message ($script:localizedData.RestartingService -f $SQLInstanceName) + Restart-SqlService -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName + } +} + +<# + .SYNOPSIS + Gets an SMO Service object instance for the requested service and type. + + .PARAMETER SQLServer + Host name of the SQL Server to manage. + + .PARAMETER SQLInstanceName + Name of the SQL instance. + + .PARAMETER ServiceType + Type of service to be managed. Must be one of the following: + DatabaseEngine, SQLServerAgent, Search, IntegrationServices, AnalysisServices, ReportingServices, SQLServerBrowser, NotificationServices. + + .EXAMPLE + Get-ServiceObject -SQLServer $env:COMPUTERNAME -SQLInstanceName MSSQLSERVER -ServiceType SqlServer +#> +function Get-ServiceObject +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $SQLServer, + + [Parameter(Mandatory = $true)] + [System.String] + $SQLInstanceName, + + [Parameter(Mandatory = $true)] + [ValidateSet('DatabaseEngine', 'SQLServerAgent', 'Search', 'IntegrationServices', 'AnalysisServices', 'ReportingServices', 'SQLServerBrowser', 'NotificationServices')] + [System.String] + $ServiceType + ) + + # Load the SMO libraries + Import-SQLPSModule + + $verboseMessage = $script:localizedData.ConnectingToWmi -f $SQLServer + New-VerboseMessage -Message $verboseMessage + + # Connect to SQL WMI + $managedComputer = New-Object Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer $SQLServer + + # Change the regex pattern for a default instance + if ($SQLInstanceName -ieq 'MSSQLServer') + { + $serviceNamePattern = '^MSSQLServer$' + } + else + { + $serviceNamePattern = ('\${0}$' -f $SQLInstanceName) + } + + # Get the proper enum value + $serviceTypeFilter = ConvertTo-ManagedServiceType -ServiceType $ServiceType + + # Get the Service object for the specified instance/type + $serviceObject = $managedComputer.Services | Where-Object -FilterScript { + ($_.Type -eq $serviceTypeFilter) -and ($_.Name -imatch $serviceNamePattern) + } + + return $serviceObject +} + +<# + .SYNOPSIS + Converts the project's standard SQL Service types to the appropriate ManagedServiceType value + + .PARAMETER ServiceType + Type of service to be managed. Must be one of the following: + DatabaseEngine, SQLServerAgent, Search, IntegrationServices, AnalysisServices, ReportingServices, SQLServerBrowser, NotificationServices. + + .EXAMPLE + ConvertTo-ManagedServiceType -ServiceType 'DatabaseEngine' +#> +function ConvertTo-ManagedServiceType +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('DatabaseEngine', 'SQLServerAgent', 'Search', 'IntegrationServices', 'AnalysisServices', 'ReportingServices', 'SQLServerBrowser', 'NotificationServices')] + [System.String] + $ServiceType + ) + + # Map the project-specific ServiceType to a valid value from the ManagedServiceType enumeration + switch ($ServiceType) + { + 'DatabaseEngine' + { + $serviceTypeValue = 'SqlServer' + } + + 'SQLServerAgent' + { + $serviceTypeValue = 'SqlAgent' + } + + 'Search' + { + $serviceTypeValue = 'Search' + } + + 'IntegrationServices' + { + $serviceTypeValue = 'SqlServerIntegrationService' + } + + 'AnalysisServices' + { + $serviceTypeValue = 'AnalysisServer' + } + + 'ReportingServices' + { + $serviceTypeValue = 'ReportServer' + } + + 'SQLServerBrowser' + { + $serviceTypeValue = 'SqlBrowser' + } + + 'NotificationServices' + { + $serviceTypeValue = 'NotificationServer' + } + } + + return $serviceTypeValue -as [Microsoft.SqlServer.Management.Smo.Wmi.ManagedServiceType] +} diff --git a/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.schema.mof b/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.schema.mof new file mode 100644 index 000000000..5b96929c8 --- /dev/null +++ b/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.schema.mof @@ -0,0 +1,10 @@ +[ClassVersion("1.0.0.0"), FriendlyName("SqlServerServiceAccount")] +class MSFT_SqlServerServiceAccount : OMI_BaseResource +{ + [Key, Description("Hostname of the SQL Server.")] String SQLServer; + [Key, Description("Name of the SQL instance.")] String SQLInstanceName; + [Key, Description("Type of service being managed."), ValueMap {"DatabaseEngine","SQLServerAgent","Search","IntegrationServices","AnalysisServices","ReportingServices","SQLServerBrowser","NotificationServices"}, Values {"DatabaseEngine","SQLServerAgent","Search","IntegrationServices","AnalysisServices","ReportingServices","SQLServerBrowser","NotificationServices"}] String ServiceType; + [Required, EmbeddedInstance("MSFT_Credential"), Description("The service account that should be used when running the service.")] String ServiceAccount; + [Write, Description("Determines whether the service is automatically restarted.")] Boolean RestartService; + [Write, Description("Forces the service account to be updated. Useful for password changes.")] Boolean Force; +}; diff --git a/DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_xSQLServerServiceAccount.strings.psd1 b/DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_xSQLServerServiceAccount.strings.psd1 new file mode 100644 index 000000000..e0b1330df --- /dev/null +++ b/DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_xSQLServerServiceAccount.strings.psd1 @@ -0,0 +1,11 @@ +# Localized resources for SqlServerServiceAccount + +ConvertFrom-StringData @' + ForceServiceAccountUpdate = Force specified, skipping tests. With this configuration, Test-TargetResource will always return 'False'. + CurrentServiceAccount = Current service account is '{0}' for {1}\{2}. + ConnectingToWmi = Connecting to WMI on '{0}'. + UpdatingServiceAccount = Setting service account to '{0}' for service {1}. + RestartingService = Restarting '{0}' and any dependent services. + ServiceNotFound = The {0} service on {1}\\{2} could not be found. + SetServiceAccountFailed = Unable to set the service account for {0} on {1}. Message {2} +'@ diff --git a/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.psm1 b/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.psm1 new file mode 100644 index 000000000..c369d1aa1 --- /dev/null +++ b/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.psm1 @@ -0,0 +1,175 @@ +Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` + -ChildPath 'SqlServerDSCHelper.psm1') ` + -Force + +<# + .SYNOPSIS + Returns the cluster role/group that is waiting to be created, + along with the time and number of times to wait. + + .PARAMETER Name + Name of the cluster role/group to look for (normally the same as the Availability Group name). + + .PARAMETER RetryIntervalSec + The interval, in seconds, to check for the presence of the cluster role/group. + Default value is 20 seconds. + When the cluster role/group has been found the resource will wait for this amount of time once + more before returning. + + .PARAMETER RetryCount + Maximum number of retries until the resource will timeout and throw an error. Default values is 30 times. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.UInt64] + $RetryIntervalSec = 20, + + [Parameter()] + [System.UInt32] + $RetryCount = 30 + ) + + $clusterGroupFound = $false + + $clusterGroup = Get-ClusterGroup -Name $Name -ErrorAction SilentlyContinue + if ($null -ne $clusterGroup) + { + $clusterGroupFound = $true + } + + return @{ + Name = $Name + RetryIntervalSec = $RetryIntervalSec + RetryCount = $RetryCount + GroupExist = $clusterGroupFound + } +} + +<# + .SYNOPSIS + Waits for a cluster role/group to be created + + .PARAMETER Name + Name of the cluster role/group to look for (normally the same as the Availability Group name). + + .PARAMETER RetryIntervalSec + The interval, in seconds, to check for the presence of the cluster role/group. + Default value is 20 seconds. + When the cluster role/group has been found the resource will wait for this amount of time once + more before returning. + + .PARAMETER RetryCount + Maximum number of retries until the resource will timeout and throw an error. Default values is 30 times. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.UInt64] + $RetryIntervalSec = 20, + + [Parameter()] + [System.UInt32] + $RetryCount = 30 + ) + + New-VerboseMessage -Message "Checking for cluster group $Name. Will try for a total of $($RetryIntervalSec*$RetryCount) seconds." + + $getTargetResourceParameters = @{ + Name = $Name + RetryIntervalSec = $RetryIntervalSec + RetryCount = $RetryCount + } + + for ($forLoopCount = 0; $forLoopCount -lt $RetryCount; $forLoopCount++) + { + $clusterGroupFound = (Get-TargetResource @getTargetResourceParameters).GroupExist + if ($clusterGroupFound) + { + New-VerboseMessage -Message "Found cluster group $Name. Will sleep for another $RetryIntervalSec seconds before continuing." + Start-Sleep -Seconds $RetryIntervalSec + break + } + + New-VerboseMessage -Message "Cluster group $Name not found. Will retry again after $RetryIntervalSec sec" + Start-Sleep -Seconds $RetryIntervalSec + } + + if (-not $clusterGroupFound) + { + throw "Cluster group $Name not found after $RetryCount attempts with $RetryIntervalSec sec interval" + } +} + +<# + .SYNOPSIS + Tests if the cluster role/group has been created. + + .PARAMETER Name + Name of the cluster role/group to look for (normally the same as the Availability Group name). + + .PARAMETER RetryIntervalSec + The interval, in seconds, to check for the presence of the cluster role/group. + Default value is 20 seconds. + When the cluster role/group has been found the resource will wait for this amount of time once + more before returning. + + .PARAMETER RetryCount + Maximum number of retries until the resource will timeout and throw an error. Default values is 30 times. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.UInt64] + $RetryIntervalSec = 20, + + [Parameter()] + [System.UInt32] + $RetryCount = 30 + ) + + New-VerboseMessage -Message "Testing for cluster group $Name." + + $getTargetResourceParameters = @{ + Name = $Name + RetryIntervalSec = $RetryIntervalSec + RetryCount = $RetryCount + } + + $clusterGroupFound = (Get-TargetResource @getTargetResourceParameters).GroupExist + if ($clusterGroupFound) + { + New-VerboseMessage -Message "Found cluster group $Name" + } + else + { + New-VerboseMessage -Message "Cluster group $Name not found" + } + + return $clusterGroupFound +} + +Export-ModuleMember -Function *-TargetResource diff --git a/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.schema.mof b/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.schema.mof new file mode 100644 index 000000000..a848cabba --- /dev/null +++ b/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.schema.mof @@ -0,0 +1,8 @@ +[ClassVersion("1.0.0.0"), FriendlyName("SqlWaitForAvailabilityGroup")] +class MSFT_SqlWaitForAvailabilityGroup : OMI_BaseResource +{ + [Key, Description("Name of the cluster role/group to look for (normally the same as the Availability Group name).")] String Name; + [Write, Description("The interval, in seconds, to check for the presence of the cluster role/group. Default value is 20 seconds. When the cluster role/group has been found the resource will wait for this amount of time once more before returning.")] Uint64 RetryIntervalSec; + [Write, Description("Maximum number of retries until the resource will timeout and throw an error. Default values is 30 times.")] Uint32 RetryCount; + [Read, Description("Returns $true if the cluster role/group exist, otherwise it returns $false. Used by Get-TargetResource.")] Boolean GroupExist; +}; diff --git a/DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.schema.mof b/DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.schema.mof deleted file mode 100644 index 6b9a4d5b0..000000000 --- a/DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.schema.mof +++ /dev/null @@ -1,24 +0,0 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerAOAGReplica")] -class MSFT_xSQLServerAOAGReplica : OMI_BaseResource -{ - [Key, Description("The name of the availability group replica. For named instances this must be in the following format SQLServer\\InstanceName.")] String Name; - [Key, Description("The name of the availability group.")] String AvailabilityGroupName; - [Required, Description("Hostname of the SQL Server to be configured.")] String SQLServer; - [Key, Description("Name of the SQL instance to be configured.")] String SQLInstanceName; - [Write, Description("Hostname of the SQL Server where the primary replica is expected to be active. If the primary replica is not found here, the resource will attempt to find the host that holds the primary replica and connect to it.")] String PrimaryReplicaSQLServer; - [Write, Description("Name of the SQL instance where the primary replica lives.")] String PrimaryReplicaSQLInstanceName; - [Write, Description("Specifies if the availability group replica should be present or absent. Default is Present."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; - [Write, Description("Specifies the replica availability mode. Default is 'AsynchronousCommit'."), ValueMap{"AsynchronousCommit","SynchronousCommit"}, Values{"AsynchronousCommit","SynchronousCommit"}] String AvailabilityMode; - [Write, Description("Specifies the desired priority of the replicas in performing backups. The acceptable values for this parameter are: integers from 0 through 100. Of the set of replicas which are online and available, the replica that has the highest priority performs the backup. Default is 50.")] UInt32 BackupPriority; - [Write, Description("Specifies how the availability replica handles connections when in the primary role."), ValueMap{"AllowAllConnections","AllowReadWriteConnections"}, Values{"AllowAllConnections","AllowReadWriteConnections"}] String ConnectionModeInPrimaryRole; - [Write, Description("Specifies how the availability replica handles connections when in the secondary role."), ValueMap{"AllowNoConnections","AllowReadIntentConnectionsOnly","AllowAllConnections"}, Values{"AllowNoConnections","AllowReadIntentConnectionsOnly","AllowAllConnections"}] String ConnectionModeInSecondaryRole; - [Write, Description("Specifies the hostname or IP address of the availability group replica endpoint. Default is the instance network name which is set in the code because the value can only be determined when connected to the SQL Instance.")] String EndpointHostName; - [Write, Description("Specifies the failover mode. Default is 'Manual'."), ValueMap{"Automatic","Manual"}, Values{"Automatic","Manual"}] String FailoverMode; - [Write, Description("Specifies the fully-qualified domain name (FQDN) and port to use when routing to the replica for read only connections.")] String ReadOnlyRoutingConnectionUrl; - [Write, Description("Specifies an ordered list of replica server names that represent the probe sequence for connection director to use when redirecting read-only connections through this availability replica. This parameter applies if the availability replica is the current primary replica of the availability group.")] String ReadOnlyRoutingList[]; - [Write, Description("Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server instance.")] Boolean ProcessOnlyOnActiveNode; - [Read, Description("Output the network port the endpoint is listening on. Used by Get-TargetResource.")] Uint16 EndpointPort; - [Read, Description("Output the endpoint URL of the Availability Group Replica. Used by Get-TargetResource.")] String EndpointUrl; - [Read, Description("Output the NetName property from the SQL Server object. Used by Get-TargetResource.")] String SqlServerNetName; - [Read, Description("Determines if the current node is actively hosting the SQL Server instance.")] Boolean IsActiveNode; -}; diff --git a/Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 b/Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 new file mode 100644 index 000000000..bb78cae9c --- /dev/null +++ b/Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 @@ -0,0 +1,120 @@ +<# +.EXAMPLE + This example shows how to ensure that the databases 'DB*' and 'AdventureWorks' are members in the Availability Group 'TestAG'. + + In the event this is applied to a Failover Cluster Instance (FCI), the + ProcessOnlyOnActiveNode property will tell the Test-TargetResource function + to evaluate if any changes are needed if the node is actively hosting the + SQL Server Instance. +#> + +$ConfigurationData = @{ + AllNodes = @( + @{ + NodeName = '*' + SQLInstanceName = 'MSSQLSERVER' + AvailabilityGroupName = 'TestAG' + }, + + @{ + NodeName = 'SQL1' + Role = 'PrimaryReplica' + }, + + @{ + NodeName = 'SQL2' + Role = 'SecondaryReplica' + } + ) +} + +Configuration Example +{ + param( + [Parameter(Mandatory = $true)] + [PSCredential] + $SysAdminAccount + ) + + Import-DscResource -ModuleName xSqlServer + + Node $AllNodes.NodeName { + # Adding the required service account to allow the cluster to log into SQL + SqlServerLogin AddNTServiceClusSvc + { + Ensure = 'Present' + Name = 'NT SERVICE\ClusSvc' + LoginType = 'WindowsUser' + SQLServer = $Node.NodeName + SQLInstanceName = $Node.SQLInstanceName + PsDscRunAsCredential = $SysAdminAccount + } + + # Add the required permissions to the cluster service login + SqlServerPermission AddNTServiceClusSvcPermissions + { + DependsOn = '[SqlServerLogin]AddNTServiceClusSvc' + Ensure = 'Present' + NodeName = $Node.NodeName + InstanceName = $Node.SqlInstanceName + Principal = 'NT SERVICE\ClusSvc' + Permission = 'AlterAnyAvailabilityGroup', 'ViewServerState' + PsDscRunAsCredential = $SysAdminAccount + } + + # Create a DatabaseMirroring endpoint + SqlServerEndpoint HADREndpoint + { + EndPointName = 'HADR' + Ensure = 'Present' + Port = 5022 + SQLServer = $Node.NodeName + SQLInstanceName = $Node.SQLInstanceName + PsDscRunAsCredential = $SysAdminAccount + } + + if ( $Node.Role -eq 'PrimaryReplica' ) + { + # Create the availability group on the instance tagged as the primary replica + SqlAG AddTestAG + { + Ensure = 'Present' + Name = $Node.AvailabilityGroupName + SQLInstanceName = $Node.SQLInstanceName + SQLServer = $Node.NodeName + DependsOn = '[SqlServerEndpoint]HADREndpoint', '[SqlServerPermission]AddNTServiceClusSvcPermissions' + PsDscRunAsCredential = $SysAdminAccount + } + } + + if ( $Node.Role -eq 'SecondaryReplica' ) + { + # Add the availability group replica to the availability group + SqlAGReplica AddReplica + { + Ensure = 'Present' + Name = $Node.NodeName + AvailabilityGroupName = $Node.AvailabilityGroupName + SQLServer = $Node.NodeName + SQLInstanceName = $Node.SQLInstanceName + PrimaryReplicaSQLServer = ( $AllNodes | Where-Object { $_.Role -eq 'PrimaryReplica' } ).NodeName + PrimaryReplicaSQLInstanceName = ( $AllNodes | Where-Object { $_.Role -eq 'PrimaryReplica' } ).SQLInstanceName + } + } + + if ( $Node.Role -eq 'PrimaryReplica' ) + { + SqlAGDatabases 'TestAGDatabaseMemberships' + { + AvailabilityGroupName = $Node.AvailabilityGroupName + BackupPath = '\\SQL1\AgInitialize' + DatabaseName = 'DB*', 'AdventureWorks' + SQLInstanceName = $Node.SQLInstanceName + SQLServer = $Node.NodeName + Ensure = 'Present' + ProcessOnlyOnActiveNode = $true + PsDscRunAsCredential = $SysAdminAccount + } + } + } +} diff --git a/Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 b/Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 new file mode 100644 index 000000000..e95c8fd6b --- /dev/null +++ b/Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 @@ -0,0 +1,114 @@ +<# +.EXAMPLE + This example shows how to ensure that the databases 'DB*' and 'AdventureWorks' are not members of the Availability Group 'TestAG'. +#> + +$ConfigurationData = @{ + AllNodes = @( + @{ + NodeName = '*' + SQLInstanceName = 'MSSQLSERVER' + AvailabilityGroupName = 'TestAG' + }, + + @{ + NodeName = 'SQL1' + Role = 'PrimaryReplica' + }, + + @{ + NodeName = 'SQL2' + Role = 'SecondaryReplica' + } + ) +} + +Configuration Example +{ + param( + [Parameter(Mandatory = $true)] + [PSCredential] + $SysAdminAccount + ) + + Import-DscResource -ModuleName xSqlServer + + Node $AllNodes.NodeName { + # Adding the required service account to allow the cluster to log into SQL + SqlServerLogin AddNTServiceClusSvc + { + Ensure = 'Present' + Name = 'NT SERVICE\ClusSvc' + LoginType = 'WindowsUser' + SQLServer = $Node.NodeName + SQLInstanceName = $Node.SQLInstanceName + PsDscRunAsCredential = $SysAdminAccount + } + + # Add the required permissions to the cluster service login + SqlServerPermission AddNTServiceClusSvcPermissions + { + DependsOn = '[SqlServerLogin]AddNTServiceClusSvc' + Ensure = 'Present' + NodeName = $Node.NodeName + InstanceName = $Node.SqlInstanceName + Principal = 'NT SERVICE\ClusSvc' + Permission = 'AlterAnyAvailabilityGroup', 'ViewServerState' + PsDscRunAsCredential = $SysAdminAccount + } + + # Create a DatabaseMirroring endpoint + SqlServerEndpoint HADREndpoint + { + EndPointName = 'HADR' + Ensure = 'Present' + Port = 5022 + SQLServer = $Node.NodeName + SQLInstanceName = $Node.SQLInstanceName + PsDscRunAsCredential = $SysAdminAccount + } + + if ( $Node.Role -eq 'PrimaryReplica' ) + { + # Create the availability group on the instance tagged as the primary replica + SqlAG AddTestAG + { + Ensure = 'Present' + Name = $Node.AvailabilityGroupName + SQLInstanceName = $Node.SQLInstanceName + SQLServer = $Node.NodeName + DependsOn = '[SqlServerEndpoint]HADREndpoint', '[SqlServerPermission]AddNTServiceClusSvcPermissions' + PsDscRunAsCredential = $SysAdminAccount + } + } + + if ( $Node.Role -eq 'SecondaryReplica' ) + { + # Add the availability group replica to the availability group + SqlAGReplica AddReplica + { + Ensure = 'Present' + Name = $Node.NodeName + AvailabilityGroupName = $Node.AvailabilityGroupName + SQLServer = $Node.NodeName + SQLInstanceName = $Node.SQLInstanceName + PrimaryReplicaSQLServer = ( $AllNodes | Where-Object { $_.Role -eq 'PrimaryReplica' } ).NodeName + PrimaryReplicaSQLInstanceName = ( $AllNodes | Where-Object { $_.Role -eq 'PrimaryReplica' } ).SQLInstanceName + } + } + + if ( $Node.Role -eq 'PrimaryReplica' ) + { + SqlAGDatabases 'TestAGDatabaseMemberships' + { + AvailabilityGroupName = $Node.AvailabilityGroupName + BackupPath = '\\SQL1\AgInitialize' + DatabaseName = 'DB*', 'AdventureWorks' + SQLInstanceName = $Node.SQLInstanceName + SQLServer = $Node.NodeName + Ensure = 'Absent' + PsDscRunAsCredential = $SysAdminAccount + } + } + } +} diff --git a/Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 b/Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 new file mode 100644 index 000000000..2f2193fb1 --- /dev/null +++ b/Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 @@ -0,0 +1,115 @@ +<# +.EXAMPLE + This example shows how to ensure that the databases 'DB*' and 'AdventureWorks' are the only members of the Availability Group 'TestAG'. +#> + +$ConfigurationData = @{ + AllNodes = @( + @{ + NodeName = '*' + SQLInstanceName = 'MSSQLSERVER' + AvailabilityGroupName = 'TestAG' + }, + + @{ + NodeName = 'SQL1' + Role = 'PrimaryReplica' + }, + + @{ + NodeName = 'SQL2' + Role = 'SecondaryReplica' + } + ) +} + +Configuration Example +{ + param( + [Parameter(Mandatory = $true)] + [PSCredential] + $SysAdminAccount + ) + + Import-DscResource -ModuleName xSqlServer + + Node $AllNodes.NodeName { + # Adding the required service account to allow the cluster to log into SQL + SqlServerLogin AddNTServiceClusSvc + { + Ensure = 'Present' + Name = 'NT SERVICE\ClusSvc' + LoginType = 'WindowsUser' + SQLServer = $Node.NodeName + SQLInstanceName = $Node.SQLInstanceName + PsDscRunAsCredential = $SysAdminAccount + } + + # Add the required permissions to the cluster service login + SqlServerPermission AddNTServiceClusSvcPermissions + { + DependsOn = '[SqlServerLogin]AddNTServiceClusSvc' + Ensure = 'Present' + NodeName = $Node.NodeName + InstanceName = $Node.SqlInstanceName + Principal = 'NT SERVICE\ClusSvc' + Permission = 'AlterAnyAvailabilityGroup', 'ViewServerState' + PsDscRunAsCredential = $SysAdminAccount + } + + # Create a DatabaseMirroring endpoint + SqlServerEndpoint HADREndpoint + { + EndPointName = 'HADR' + Ensure = 'Present' + Port = 5022 + SQLServer = $Node.NodeName + SQLInstanceName = $Node.SQLInstanceName + PsDscRunAsCredential = $SysAdminAccount + } + + if ( $Node.Role -eq 'PrimaryReplica' ) + { + # Create the availability group on the instance tagged as the primary replica + SqlAG AddTestAG + { + Ensure = 'Present' + Name = $Node.AvailabilityGroupName + SQLInstanceName = $Node.SQLInstanceName + SQLServer = $Node.NodeName + DependsOn = '[SqlServerEndpoint]HADREndpoint', '[SqlServerPermission]AddNTServiceClusSvcPermissions' + PsDscRunAsCredential = $SysAdminAccount + } + } + + if ( $Node.Role -eq 'SecondaryReplica' ) + { + # Add the availability group replica to the availability group + SqlAGReplica AddReplica + { + Ensure = 'Present' + Name = $Node.NodeName + AvailabilityGroupName = $Node.AvailabilityGroupName + SQLServer = $Node.NodeName + SQLInstanceName = $Node.SQLInstanceName + PrimaryReplicaSQLServer = ( $AllNodes | Where-Object { $_.Role -eq 'PrimaryReplica' } ).NodeName + PrimaryReplicaSQLInstanceName = ( $AllNodes | Where-Object { $_.Role -eq 'PrimaryReplica' } ).SQLInstanceName + } + } + + if ( $Node.Role -eq 'PrimaryReplica' ) + { + SqlAGDatabases 'TestAGDatabaseMemberships' + { + AvailabilityGroupName = $Node.AvailabilityGroupName + BackupPath = '\\SQL1\AgInitialize' + DatabaseName = 'DB*', 'AdventureWorks' + SQLInstanceName = $Node.SQLInstanceName + SQLServer = $Node.NodeName + Ensure = 'Present' + Force = $true + PsDscRunAsCredential = $SysAdminAccount + } + } + } +} diff --git a/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 b/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 new file mode 100644 index 000000000..6c0e81369 --- /dev/null +++ b/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 @@ -0,0 +1,27 @@ +<# +.EXAMPLE + This example shows how to ensure the SQL Server service + on TestServer is running under a user account. +#> + +Configuration Example +{ + param( + [Parameter(Mandatory = $true)] + [PSCredential] + $ServiceAccountCredential + ) + + Import-DscResource -ModuleName xSqlServer + + Node localhost { + SqlServerServiceAccount SetServiceAcccount_User + { + SQLServer = 'TestServer' + SQLInstanceName = 'MSSQLSERVER' + ServiceType = 'DatabaseEngine' + ServiceAccount = $ServiceAccountCredential + RestartService = $true + } + } +} diff --git a/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 b/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 new file mode 100644 index 000000000..4a9918c2d --- /dev/null +++ b/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 @@ -0,0 +1,31 @@ +<# +.EXAMPLE + This example shows how to ensure the SQL Server service + on TestServer\DSC is running under a virtual account. + Force will cause this account to be set every time the + configuration is evaluated. Specifying RestartService will + cause the service to be restarted. +#> + +Configuration Example +{ + param( + [Parameter(Mandatory = $true)] + [PSCredential] + $ServiceAcccountCredential + ) + + Import-DscResource -ModuleName xSqlServer + + Node localhost { + SqlServerServiceAccount SetServiceAcccount_User + { + SQLServer = 'TestServer' + SQLInstanceName = 'DSC' + ServiceType = 'DatabaseEngine' + ServiceAccount = $ServiceAcccountCredential + RestartService = $true + Force = $true + } + } +} diff --git a/Examples/Resources/SqlWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1 b/Examples/Resources/SqlWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1 new file mode 100644 index 000000000..0624fe90c --- /dev/null +++ b/Examples/Resources/SqlWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1 @@ -0,0 +1,28 @@ +<# + .EXAMPLE + This example will wait for the cluster role/group 'AGTest1'. +#> +Configuration Example +{ + param + ( + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $SysAdminAccount + ) + + Import-DscResource -ModuleName SqlServerDSC + + node localhost + { + SqlWaitForAvailabilityGroup SQLConfigureAG-WaitAGTest1 + { + Name = 'AGTest1' + RetryIntervalSec = 20 + RetryCount = 30 + + PsDscRunAsCredential = $SysAdminAccount + } + } +} diff --git a/Examples/Resources/SqlWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1 b/Examples/Resources/SqlWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1 new file mode 100644 index 000000000..739ead20f --- /dev/null +++ b/Examples/Resources/SqlWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1 @@ -0,0 +1,37 @@ +<# + .EXAMPLE + This example will wait for both the cluster roles/groups 'AGTest1' and 'AGTest2'. +#> +Configuration Example +{ + param + ( + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $SysAdminAccount + ) + + Import-DscResource -ModuleName SqlServerDSC + + node localhost + { + SqlWaitForAvailabilityGroup SQLConfigureAG-WaitAGTest1 + { + Name = 'AGTest1' + RetryIntervalSec = 20 + RetryCount = 30 + + PsDscRunAsCredential = $SysAdminAccount + } + + SqlWaitForAvailabilityGroup SQLConfigureAG-WaitAGTest2 + { + Name = 'AGTest2' + RetryIntervalSec = 20 + RetryCount = 30 + + PsDscRunAsCredential = $SysAdminAccount + } + } +} diff --git a/SQLServerDsc.psd1 b/SQLServerDsc.psd1 index 0164f2fd5..b6f8cb987 100644 --- a/SQLServerDsc.psd1 +++ b/SQLServerDsc.psd1 @@ -1,6 +1,6 @@ @{ # Version number of this module. -ModuleVersion = '8.2.0.0' +ModuleVersion = '9.0.0.0' # ID used to uniquely identify this module GUID = '74e9ddb5-4cbc-4fa2-a222-2bcfb533fd66' @@ -108,7 +108,48 @@ PrivateData = @{ - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, the resource will only determine if a change is needed if the target node is the active host of the SQL Server instance ([issue 882](https://github.com/PowerShell/xSQLServer/issues/882)). - + - Fixed the formatting for the AvailabilityGroupNotFound error. + - Added the following read-only properties to the schema ([issue 477](https://github.com/PowerShell/xSQLServer/issues/477)) + - EndpointPort + - EndpointURL + - Use the new helper function "Test-ClusterPermissions". + - Use the Get-PrimaryReplicaServerObject helper function +- Changes to xSQLServerHelper + - Fixed Connect-SQL by ensuring the Status property returns "Online" prior to + returning the SQL Server object ([issue 333](https://github.com/PowerShell/xSQLServer/issues/333)). +- Changes to xSQLServerRole + - Running Get-DscConfiguration no longer throws an error saying property + Members is not an array ([issue 790](https://github.com/PowerShell/xSQLServer/issues/790)). +- Changes to xSQLServerMaxDop + - Fixed error where Measure-Object cmdlet would fail claiming it could not + find the specified property ([issue 801](https://github.com/PowerShell/xSQLServer/issues/801)) +- Changes to xSQLServerAlwaysOnService + - Added integration test ([issue 736](https://github.com/PowerShell/xSQLServer/issues/736)). + - Added ErrorAction "Stop" to the cmdlet Start-DscConfiguration + ([issue 824](https://github.com/PowerShell/xSQLServer/issues/824)). +- Changes to SMO.cs + - Added default properties to the Server class + - AvailabilityGroups + - Databases + - EndpointCollection + - Added a new overload to the Login class + - Added default properties to the AvailabilityReplicas class + - AvailabilityDatabases + - AvailabilityReplicas +- Added new resource xSQLServerAccount ([issue 706](https://github.com/PowerShell/xSQLServer/issues/706)) + - Added localization support for all strings + - Added examples for usage +- Changes to SqlRS + - No longer returns a null value from Test-TargetResource when Reporting + Services has not been initialized ([issue 822](https://github.com/PowerShell/xSQLServer/issues/822)). + - Fixed so that when two Reporting Services are installed for the same major + version the resource does not throw an error ([issue 819](https://github.com/PowerShell/xSQLServer/issues/819)). + - Now the resource will restart the Reporting Services service after + initializing ([issue 592](https://github.com/PowerShell/xSQLServer/issues/592)). + This will enable the Reports site to work. + - Added integration test ([issue 753](https://github.com/PowerShell/xSQLServer/issues/753)). + - Added support for configuring URL reservations and virtual directory names + ([issue 570](https://github.com/PowerShell/xSQLServer/issues/570)) ' } # End of PSData hashtable diff --git a/SqlServerDscHelper.psm1 b/SqlServerDscHelper.psm1 index ff3da136d..26ca553ec 100644 --- a/SqlServerDscHelper.psm1 +++ b/SqlServerDscHelper.psm1 @@ -3,7 +3,7 @@ Import-Module -Name (Join-Path -Path (Join-Path -Path $PSScriptRoot ` -ChildPath 'DscResources') ` -ChildPath 'CommonResourceHelper.psm1') -$script:localizedData = Get-LocalizedData -ResourceName 'SqlServerDscHelper' -ScriptRoot $PSScriptRoot +$script:localizedData = Get-LocalizedData -ResourceName 'SqlServerHelper' -ScriptRoot $PSScriptRoot <# .SYNOPSIS diff --git a/Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 b/Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 index 77e6f90ed..0f18dfce6 100644 --- a/Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 +++ b/Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 @@ -26,7 +26,11 @@ Configuration MSFT_SqlAlwaysOnService_EnableAlwaysOn_Config ) Import-DscResource -ModuleName 'PSDscResources' +<<<<<<< HEAD:Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 Import-DscResource -ModuleName 'SqlServerDsc' +======= + Import-DscResource -ModuleName 'SqlServerDSC' +>>>>>>> first pass at complete rename:Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 node localhost { WindowsFeature 'AddFeatureFailoverClustering' @@ -151,7 +155,11 @@ Configuration MSFT_SqlAlwaysOnService_DisableAlwaysOn_Config $SqlInstallCredential ) +<<<<<<< HEAD:Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 Import-DscResource -ModuleName 'SqlServerDsc' +======= + Import-DscResource -ModuleName 'SqlServerDSC' +>>>>>>> first pass at complete rename:Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 node localhost { SqlAlwaysOnService 'Integration_Test' diff --git a/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 b/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 index 3a55bc697..596488482 100644 --- a/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 +++ b/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 @@ -68,7 +68,11 @@ Configuration MSFT_SqlDatabaseDefaultLocation_Log_Config ) Import-DscResource -ModuleName 'PSDesiredStateConfiguration' +<<<<<<< HEAD:Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 Import-DscResource -ModuleName 'SqlServerDsc' +======= + Import-DscResource -ModuleName 'SqlServerDSC' +>>>>>>> first pass at complete rename:Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 node localhost { File 'SQLLogPath' @@ -106,7 +110,11 @@ Configuration MSFT_SqlDatabaseDefaultLocation_Backup_Config ) Import-DscResource -ModuleName 'PSDesiredStateConfiguration' +<<<<<<< HEAD:Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 Import-DscResource -ModuleName 'SqlServerDsc' +======= + Import-DscResource -ModuleName 'SqlServerDSC' +>>>>>>> first pass at complete rename:Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 node localhost { File 'SQLBackupPath' diff --git a/Tests/SqlServerDscCommon.Tests.ps1 b/Tests/SqlServerDscCommon.Tests.ps1 index 43c3f6d17..366949946 100644 --- a/Tests/SqlServerDscCommon.Tests.ps1 +++ b/Tests/SqlServerDscCommon.Tests.ps1 @@ -5,7 +5,7 @@ param() $script:moduleRoot = Split-Path $PSScriptRoot -Parent -Describe 'SqlServerDsc module common tests' { +Describe 'SqlServerDSC module common tests' { Context -Name 'When there are example file for resource' { <# For Appveyor builds copy the module to the system modules directory so it falls @@ -13,7 +13,7 @@ Describe 'SqlServerDsc module common tests' { #> if ($env:APPVEYOR) { - $powershellModulePath = Join-Path -Path (($env:PSModulePath -split ';')[0]) -ChildPath 'SqlServerDsc' + $powershellModulePath = Join-Path -Path (($env:PSModulePath -split ';')[0]) -ChildPath 'SqlServerDSC' Copy-item -Path $env:APPVEYOR_BUILD_FOLDER -Destination $powershellModulePath -Recurse -Force } @@ -69,7 +69,7 @@ Describe 'SqlServerDsc module common tests' { Remove-item -Path $powershellModulePath -Recurse -Force -Confirm:$false # Restore the module in 'memory' to ensure other tests after this test have access to it - Import-Module -Name "$script:moduleRoot\SqlServerDsc.psd1" -Global -Force + Import-Module -Name "$script:moduleRoot\SqlServerDSC.psd1" -Global -Force } } } diff --git a/Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 b/Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 new file mode 100644 index 000000000..50d21d59e --- /dev/null +++ b/Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 @@ -0,0 +1,1530 @@ +#region HEADER + +# Unit Test Template Version: 1.2.0 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) +} + +Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force +Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent | Split-Path -Parent) -ChildPath 'SqlServerDSCHelper.psm1') -Scope Global -Force +Import-Module -Name ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stubs ) -ChildPath SQLPSStub.psm1 ) -Force -Global + +# Loading mocked classes +Add-Type -Path ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stubs ) -ChildPath SMO.cs ) + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName 'SqlServerDSC' ` + -DSCResourceName 'MSFT_SqlAGDatabases' ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup { + +} + +function Invoke-TestCleanup { + Restore-TestEnvironment -TestEnvironment $TestEnvironment + + # TODO: Other Optional Cleanup Code Goes Here... +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope 'MSFT_SqlAGDatabases' { + + #region Parameter Mocks + + # The databases defined in the resource + $mockDatabaseNameParameter = @( + 'DB*' + 'AnotherDB' + '3rd*OfDatabase' + '4th*OfDatabase' + ) + + $mockDatabaseNameParameterWithNonExistingDatabases = @( + 'NotFound*' + 'Unknown1' + ) + + $mockBackupPath = 'X:\Backup' + + $mockProcessOnlyOnActiveNode = $false + + #endregion Parameter Mocks + + #region mock names + + $mockServerObjectDomainInstanceName = 'Server1' + $mockPrimaryServerObjectDomainInstanceName = 'Server2' + $mockAvailabilityGroupObjectName = 'AvailabilityGroup1' + $mockAvailabilityGroupWithoutDatabasesObjectName = 'AvailabilityGroupWithoutDatabases' + $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServerName = 'AvailabilityGroup2' + + #endregion mock names + + #region Availability Replica Mocks + + $mockAvailabilityReplicaObjects = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityReplicaCollection + foreach ( $mockAvailabilityReplicaName in @('Server1','Server2') ) + { + $newAvailabilityReplicaObject = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityReplica + $newAvailabilityReplicaObject.Name = $mockAvailabilityReplicaName + + if ( $mockServerObjectDomainInstanceName -eq $mockAvailabilityReplicaName ) + { + $newAvailabilityReplicaObject.Role = 'Primary' + } + + $mockAvailabilityReplicaObjects.Add($newAvailabilityReplicaObject) + } + + #endregion Availability Replica Mocks + + #region Availability Group Mocks + + $mockAvailabilityDatabaseNames = @( + 'DB2' + '3rdTypeOfDatabase' + 'UndefinedDatabase' + ) + + $mockAvailabilityDatabaseAbsentResults = @( + 'DB2' + '3rdTypeOfDatabase' + ) + + $mockAvailabilityDatabaseExactlyAddResults = @( + 'DB1' + ) + + $mockAvailabilityDatabaseExactlyRemoveResults = @( + 'UndefinedDatabase' + ) + + $mockAvailabilityDatabasePresentResults = @( + 'DB1' + ) + + $mockAvailabilityDatabaseObjects = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityDatabaseCollection + foreach ( $mockAvailabilityDatabaseName in $mockAvailabilityDatabaseNames ) + { + $newAvailabilityDatabaseObject = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityDatabase + $newAvailabilityDatabaseObject.Name = $mockAvailabilityDatabaseName + $mockAvailabilityDatabaseObjects.Add($newAvailabilityDatabaseObject) + } + + $mockBadAvailabilityGroupObject = New-Object -TypeName Object + + $mockAvailabilityGroupObject = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityGroup + $mockAvailabilityGroupObject.AvailabilityDatabases = $mockAvailabilityDatabaseObjects + $mockAvailabilityGroupObject.Name = $mockAvailabilityGroupObjectName + $mockAvailabilityGroupObject.PrimaryReplicaServerName = $mockServerObjectDomainInstanceName + $mockAvailabilityGroupObject.AvailabilityReplicas = $mockAvailabilityReplicaObjects + + $mockAvailabilityGroupWithoutDatabasesObject = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityGroup + $mockAvailabilityGroupWithoutDatabasesObject.Name = $mockAvailabilityGroupWithoutDatabasesObjectName + $mockAvailabilityGroupWithoutDatabasesObject.PrimaryReplicaServerName = $mockServerObjectDomainInstanceName + $mockAvailabilityGroupWithoutDatabasesObject.AvailabilityReplicas = $mockAvailabilityReplicaObjects + + $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityGroup + $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.AvailabilityDatabases = $mockAvailabilityDatabaseObjects + $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.Name = $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServerName + $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.PrimaryReplicaServerName = $mockPrimaryServerObjectDomainInstanceName + $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.AvailabilityReplicas = $mockAvailabilityReplicaObjects + + #endregion Availability Group Mocks + + #region Certificate Mocks + + [byte[]]$mockThumbprint1 = @( + 83 + 121 + 115 + 116 + 101 + 109 + 46 + 84 + 101 + 120 + 116 + 46 + 85 + 84 + 70 + 56 + 69 + 110 + 99 + 111 + 100 + 105 + 110 + 103 + ) + + [byte[]]$mockThumbprint2 = @( + 83 + 121 + 115 + 23 + 101 + 109 + 46 + 84 + 101 + 120 + 116 + 85 + 85 + 84 + 70 + 56 + 69 + 23 + 99 + 111 + 100 + 105 + 110 + 103 + ) + + $mockCertificateObject1 = New-Object Microsoft.SqlServer.Management.Smo.Certificate + $mockCertificateObject1.Thumbprint = $mockThumbprint1 + + $mockCertificateObject2 = New-Object Microsoft.SqlServer.Management.Smo.Certificate + $mockCertificateObject2.Thumbprint = $mockThumbprint2 + + $mockDatabaseEncryptionKeyObject = New-Object Microsoft.SqlServer.Management.Smo.DatabaseEncryptionKey + $mockDatabaseEncryptionKeyObject.EncryptorName = 'TDE Cert' + $mockDatabaseEncryptionKeyObject.Thumbprint = $mockThumbprint1 + + #endregion Certificate Mocks + + #region Database File Mocks + + $mockDataFilePath = 'E:\SqlData' + $mockLogFilePath = 'F:\SqlLog' + $mockDataFilePathIncorrect = 'G:\SqlData' + $mockLogFilePathIncorrect = 'H:\SqlData' + + #endregion Database File Mocks + + #region Database Mocks + + # The databases found on the instance + $mockPresentDatabaseNames = @( + 'DB1' + 'DB2' + '3rdTypeOfDatabase' + 'UndefinedDatabase' + ) + + $mockMasterDatabaseName = 'master' + $mockMasterDatabaseObject1 = New-Object Microsoft.SqlServer.Management.Smo.Database + $mockMasterDatabaseObject1.Name = $mockMasterDatabaseName + $mockMasterDatabaseObject1.ID = 1 + $mockMasterDatabaseObject1.Certificates = @($mockCertificateObject1) + $mockMasterDatabaseObject1.FileGroups = @{ + Name = 'PRIMARY' + Files = @{ + FileName = ( [IO.Path]::Combine( $mockDataFilePath, "$($mockMasterDatabaseName).mdf" ) ) + } + } + $mockMasterDatabaseObject1.LogFiles = @{ + FileName = ( [IO.Path]::Combine( $mockLogFilePath, "$($mockMasterDatabaseName).ldf" ) ) + } + + $mockDatabaseObjects = New-Object Microsoft.SqlServer.Management.Smo.DatabaseCollection + foreach ( $mockPresentDatabaseName in $mockPresentDatabaseNames ) + { + $newDatabaseObject = New-Object Microsoft.SqlServer.Management.Smo.Database + $newDatabaseObject.Name = $mockPresentDatabaseName + $newDatabaseObject.FileGroups = @{ + Name = 'PRIMARY' + Files = @{ + FileName = ( [IO.Path]::Combine( $mockDataFilePath, "$($mockPresentDatabaseName).mdf" ) ) + } + } + $newDatabaseObject.LogFiles = @{ + FileName = ( [IO.Path]::Combine( $mockLogFilePath, "$($mockPresentDatabaseName).ldf" ) ) + } + + # Add the database object to the database collection + $mockDatabaseObjects.Add($newDatabaseObject) + } + $mockDatabaseObjects.Add($mockMasterDatabaseObject1) + + $mockDatabaseObjectsWithIncorrectFileNames = New-Object Microsoft.SqlServer.Management.Smo.DatabaseCollection + foreach ( $mockPresentDatabaseName in $mockPresentDatabaseNames ) + { + $newDatabaseObject = New-Object Microsoft.SqlServer.Management.Smo.Database + $newDatabaseObject.Name = $mockPresentDatabaseName + $newDatabaseObject.FileGroups = @{ + Name = 'PRIMARY' + Files = @{ + FileName = ( [IO.Path]::Combine( $mockDataFilePathIncorrect, "$($mockPresentDatabaseName).mdf" ) ) + } + } + $newDatabaseObject.LogFiles = @{ + FileName = ( [IO.Path]::Combine( $mockLogFilePathIncorrect, "$($mockPresentDatabaseName).ldf" ) ) + } + + # Add the database object to the database collection + $mockDatabaseObjectsWithIncorrectFileNames.Add($newDatabaseObject) + } + + #endregion Database Mocks + + #region Server mocks + + $mockBadServerObject = New-Object -TypeName Object + + $mockServerObject = New-Object Microsoft.SqlServer.Management.Smo.Server + $mockServerObject.AvailabilityGroups = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityGroupCollection + $mockServerObject.AvailabilityGroups.Add($mockAvailabilityGroupObject.Clone()) + $mockServerObject.AvailabilityGroups.Add($mockAvailabilityGroupWithoutDatabasesObject.Clone()) + $mockServerObject.AvailabilityGroups.Add($mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.Clone()) + $mockServerObject.Databases = $mockDatabaseObjects + $mockServerObject.DomainInstanceName = $mockServerObjectDomainInstanceName + $mockServerObject.NetName = $mockServerObjectDomainInstanceName + $mockServerObject.ServiceName = 'MSSQLSERVER' + $mockServerObject.AvailabilityGroups[$mockAvailabilityGroupObject.Name].LocalReplicaRole = 'Primary' + $mockServerObject.AvailabilityGroups[$mockAvailabilityGroupWithoutDatabasesObject.Name].LocalReplicaRole = 'Primary' + $mockServerObject.AvailabilityGroups[$mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.Name].LocalReplicaRole = 'Secondary' + + $mockServer2Object = New-Object Microsoft.SqlServer.Management.Smo.Server + $mockServer2Object.AvailabilityGroups = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityGroupCollection + $mockServer2Object.AvailabilityGroups.Add($mockAvailabilityGroupObject.Clone()) + $mockServer2Object.AvailabilityGroups.Add($mockAvailabilityGroupWithoutDatabasesObject.Clone()) + $mockServer2Object.AvailabilityGroups.Add($mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.Clone()) + $mockServer2Object.Databases = $mockDatabaseObjects + $mockServer2Object.DomainInstanceName = $mockPrimaryServerObjectDomainInstanceName + $mockServer2Object.NetName = $mockPrimaryServerObjectDomainInstanceName + $mockServer2Object.ServiceName = 'MSSQLSERVER' + $mockServer2Object.AvailabilityGroups[$mockAvailabilityGroupObject.Name].LocalReplicaRole = 'Secondary' + $mockServer2Object.AvailabilityGroups[$mockAvailabilityGroupWithoutDatabasesObject.Name].LocalReplicaRole = 'Secondary' + $mockServer2Object.AvailabilityGroups[$mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.Name].LocalReplicaRole = 'Primary' + + #endregion Server mocks + + #region Invoke Query Mock + + $mockResultInvokeQueryFileExist = { + return @{ + Tables = @{ + Rows = @{ + 'File is a Directory' = 1 + } + } + } + } + + $mockResultInvokeQueryFileNotExist = { + return @{ + Tables = @{ + Rows = @{ + 'File is a Directory' = 0 + } + } + } + } + + $mockInvokeQueryParameterRestoreDatabase = { + $Query -like 'RESTORE DATABASE * +FROM DISK = * +WITH NORECOVERY' + } + + $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs = { + $Query -like 'EXECUTE AS LOGIN = * +RESTORE DATABASE * +FROM DISK = * +WITH NORECOVERY' + } + + #endregion Invoke Query Mock + + Describe 'SqlAGDatabases\Get-TargetResource' { + BeforeAll { + Mock -CommandName Connect-SQL -MockWith { return $mockServerObject } -Verifiable + Mock -CommandName Import-SQLPSModule -MockWith {} -Verifiable + } + + BeforeEach { + $getTargetResourceParameters = @{ + DatabaseName = $mockDatabaseNameParameter.Clone() + SqlServer = 'Server1' + SQLInstanceName = 'MSSQLSERVER' + AvailabilityGroupName = 'AvailabilityGroup1' + BackupPath = $($mockBackupPath) + } + } + + Context 'When the Get-TargetResource function is called' { + It 'Should not return an availability group name or availability databases when the availability group does not exist' { + $getTargetResourceParameters.AvailabilityGroupName = 'NonExistentAvailabilityGroup' + + $result = Get-TargetResource @getTargetResourceParameters + + $result.SqlServer | Should -Be $getTargetResourceParameters.SqlServer + $result.SQLInstanceName | Should -Be $getTargetResourceParameters.SQLInstanceName + $result.AvailabilityGroupName | Should -BeNullOrEmpty + $result.DatabaseName | Should -BeNullOrEmpty + + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 0 -Exactly + } + + It 'Should not return any databases if there are no databases in the availability group' { + $getTargetResourceParameters.AvailabilityGroupName = $mockAvailabilityGroupWithoutDatabasesObject.Name + + $result = Get-TargetResource @getTargetResourceParameters + + $result.SqlServer | Should -Be $getTargetResourceParameters.SqlServer + $result.SQLInstanceName | Should -Be $getTargetResourceParameters.SQLInstanceName + $result.AvailabilityGroupName | Should -Be $mockAvailabilityGroupWithoutDatabasesObject.Name + $result.DatabaseName | Should -BeNullOrEmpty + + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 0 -Exactly + } + + It 'Should return databases when there are databases in the availability group' { + $result = Get-TargetResource @getTargetResourceParameters + + $result.SqlServer | Should -Be $getTargetResourceParameters.SqlServer + $result.SQLInstanceName | Should -Be $getTargetResourceParameters.SQLInstanceName + $result.AvailabilityGroupName | Should -Be $mockAvailabilityGroupObject.Name + + foreach ( $resultDatabaseName in $result.DatabaseName ) + { + $mockAvailabilityDatabaseNames -contains $resultDatabaseName | Should -Be $true + } + + foreach ( $mockAvailabilityDatabaseName in $mockAvailabilityDatabaseNames ) + { + $result.DatabaseName -contains $mockAvailabilityDatabaseName | Should -Be $true + } + + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 0 -Exactly + } + } + } + + Describe 'SqlAGDatabases\Set-TargetResource' { + BeforeAll { + Mock -CommandName Get-PrimaryReplicaServerObject -MockWith { return $mockServerObject } -Verifiable -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Mock -CommandName Get-PrimaryReplicaServerObject -MockWith { return $mockServer2Object } -Verifiable -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Mock -CommandName Import-SQLPSModule -MockWith {} -Verifiable + Mock -CommandName Invoke-Query -MockWith {} -Verifiable -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Mock -CommandName Invoke-Query -MockWith {} -Verifiable -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Mock -CommandName Join-Path -MockWith { [IO.Path]::Combine($databaseMembershipClass.BackupPath,"$($database.Name)_Full_$(Get-Date -Format 'yyyyMMddhhmmss').bak") } -Verifiable -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Mock -CommandName Join-Path -MockWith { [IO.Path]::Combine($databaseMembershipClass.BackupPath,"$($database.Name)_Log_$(Get-Date -Format 'yyyyMMddhhmmss').trn") } -Verifiable -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Mock -CommandName New-TerminatingError { $ErrorType } -Verifiable + Mock -CommandName Remove-Item -MockWith {} -Verifiable + Mock -CommandName Restore-SqlDatabase -MockWith {} -Verifiable + } + + BeforeEach { + $mockSetTargetResourceParameters = @{ + DatabaseName = $($mockDatabaseNameParameter) + SQLServer = $($mockServerObject.DomainInstanceName) + SQLInstanceName = $('MSSQLSERVER') + AvailabilityGroupName = $($mockAvailabilityGroupObjectName) + BackupPath = $($mockBackupPath) + Ensure = 'Present' + Force = $false + MatchDatabaseOwner = $true + } + + Mock -CommandName Add-SqlAvailabilityDatabase -MockWith {} -Verifiable -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Mock -CommandName Add-SqlAvailabilityDatabase -MockWith {} -Verifiable -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Mock -CommandName Add-SqlAvailabilityDatabase -MockWith {} -Verifiable -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Mock -CommandName Add-SqlAvailabilityDatabase -MockWith {} -Verifiable -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Mock -CommandName Backup-SqlDatabase -MockWith {} -Verifiable -ParameterFilter { $BackupAction -eq 'Database' } + Mock -CommandName Backup-SqlDatabase -MockWith {} -Verifiable -ParameterFilter { $BackupAction -eq 'Log'} + Mock -CommandName Connect-SQL -MockWith { return $mockServerObject } -Verifiable -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Mock -CommandName Connect-SQL -MockWith { return $mockServerObject } -Verifiable -ParameterFilter { $SqlServer -eq 'Server1' } + Mock -CommandName Connect-SQL -MockWith { return $mockServer2Object } -Verifiable -ParameterFilter { $SqlServer -eq 'Server2' } + Mock -CommandName Invoke-Query -MockWith $mockResultInvokeQueryFileExist -Verifiable -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Mock -CommandName Remove-SqlAvailabilityDatabase -MockWith {} -Verifiable + Mock -CommandName Test-ImpersonatePermissions -MockWith { $true } -Verifiable + } + + Context 'When Ensure is Present' { + It 'Should add the specified databases to the availability group' { + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Not -Throw + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 3 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 1 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly + } + + It 'Should add the specified databases to the availability group when the primary replica is on another server' { + $mockSetTargetResourceParameters.AvailabilityGroupName = $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServerName + + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Not -Throw + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 3 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 1 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly + } + + It 'Should not do anything if no databases were found to add' { + $mockSetTargetResourceParameters.DatabaseName = $mockAvailabilityDatabaseNames + + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Not -Throw + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 0 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 0 -Exactly + } + + It 'Should add the specified databases to the availability group when "MatchDatabaseOwner" is $false' { + $mockSetTargetResourceParameters.MatchDatabaseOwner = $false + + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Not -Throw + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 1 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 0 -Exactly + } + + It 'Should throw the correct error when "MatchDatabaseOwner" is $true and the current login does not have impersonate permissions' { + Mock -CommandName Test-ImpersonatePermissions -MockWith { $false } -Verifiable + + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw "The login '$([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)' is missing impersonate permissions in the instances 'Server2'." + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly + } + + $prerequisiteChecks = @{ + RecoveryModel = 'Full' + ReadOnly = $false + UserAccess = 'Multiple' + AutoClose = $false + AvailabilityGroupName = '' + IsMirroringEnabled = $false + } + + foreach ( $prerequisiteCheck in $prerequisiteChecks.GetEnumerator() ) + { + It "Should throw the correct error when the database property '$($prerequisiteCheck.Key)' is not '$($prerequisiteCheck.Value)'" { + $originalValue = $mockServerObject.Databases['DB1'].($prerequisiteCheck.Key) + $mockServerObject.Databases['DB1'].($prerequisiteCheck.Key) = $true + + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw "The operation on the database 'DB1' failed with the following errors: The following prerequisite checks failed: $($prerequisiteCheck.Key) is not $($prerequisiteCheck.Value)." + + foreach ( $databaseProperty in $prerequisiteChecks.GetEnumerator() ) + { + if ( $prerequisiteCheck.Key -eq $databaseProperty.Key ) + { + $mockServerObject.Databases['DB1'].($databaseProperty.Key) | Should -Not -Be ($databaseProperty.Value) + } + else + { + $mockServerObject.Databases['DB1'].($databaseProperty.Key) | Should -Be ($databaseProperty.Value) + } + } + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly + + $mockServerObject.Databases['DB1'].($prerequisiteCheck.Key) = $originalValue + } + } + + It 'Should throw the correct error when the database property "ID" is less than "4"' { + $mockSetTargetResourceParameters.DatabaseName = @('master') + + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw "The operation on the database 'master' failed with the following errors: The following prerequisite checks failed: The database cannot be a system database." + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly + } + + $filestreamProperties = @{ + DefaultFileStreamFileGroup = '' + FilestreamDirectoryName = '' + FilestreamNonTransactedAccess = 'Off' + } + + foreach ( $filestreamProperty in $filestreamProperties.GetEnumerator() ) + { + It "Should throw the correct error 'AlterAvailabilityGroupDatabaseMembershipFailure' when the database property '$($filestreamProperty.Key)' is not '$($filestreamProperty.Value)'" { + $originalValue = $mockServerObject.Databases['DB1'].($filestreamProperty.Key) + $mockServerObject.Databases['DB1'].($filestreamProperty.Key) = 'On' + + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw "The operation on the database 'DB1' failed with the following errors: The following prerequisite checks failed: Filestream is disabled on the following instances: Server2" + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 3 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly + + $mockServerObject.Databases['DB1'].($filestreamProperty.Key) = $originalValue + } + } + + It 'Should throw the correct error when the database property "ContainmentType" is not "Partial"' { + $originalValue = $mockServerObject.Databases['DB1'].ContainmentType + $mockServerObject.Databases['DB1'].ContainmentType = 'Partial' + + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw "The operation on the database 'DB1' failed with the following errors: The following prerequisite checks failed: Contained Database Authentication is not enabled on the following instances: " + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 3 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly + + $mockServerObject.Databases['DB1'].ContainmentType = $originalValue + } + + It 'Should throw the correct error when the database file path does not exist on the secondary replica' { + Mock -CommandName Invoke-Query -MockWith $mockResultInvokeQueryFileNotExist -Verifiable -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + $originalValue = $mockServer2Object.Databases['DB1'].FileGroups.Files.FileName + $mockServer2Object.Databases['DB1'].FileGroups.Files.FileName = ( [IO.Path]::Combine( 'X:\', "DB1.mdf" ) ) + + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw "The operation on the database 'DB1' failed with the following errors: The following prerequisite checks failed: The instance 'Server2' is missing the following directories: X:\, F:\SqlLog" + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly + + $mockServer2Object.Databases['DB1'].FileGroups.Files.FileName = $originalValue + } + + It 'Should throw the correct error when the log file path does not exist on the secondary replica' { + Mock -CommandName Invoke-Query -MockWith $mockResultInvokeQueryFileNotExist -Verifiable -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + $originalValue = $mockServer2Object.Databases['DB1'].LogFiles.FileName + $mockServer2Object.Databases['DB1'].LogFiles.FileName = ( [IO.Path]::Combine( 'Y:\', "DB1.ldf" ) ) + + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw 'The operation on the database ''DB1'' failed with the following errors: The following prerequisite checks failed: The instance ''Server2'' is missing the following directories: E:\SqlData, Y:\' + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly + + $mockServer2Object.Databases['DB1'].LogFiles.FileName = $originalValue + } + + It 'Should throw the correct error when TDE is enabled on the database but the certificate is not present on the replica instances' { + $mockServerObject.Databases['DB1'].EncryptionEnabled = $true + $mockServerObject.Databases['DB1'].DatabaseEncryptionKey = $mockDatabaseEncryptionKeyObject + $mockServer2Object.Databases['master'].Certificates = @($mockCertificateObject2) + + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw 'The operation on the database ''DB1'' failed with the following errors: The following prerequisite checks failed: The instance ''Server2'' is missing the following certificates: TDE Cert' + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 3 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly + + $mockServerObject.Databases['DB1'].EncryptionEnabled = $false + $mockServerObject.Databases['DB1'].DatabaseEncryptionKey = $null + $mockServer2Object.Databases['master'].Certificates = @($mockCertificateObject1) + } + + It 'Should add the specified databases to the availability group when the database has not been previously backed up' { + $mockServerObject.Databases['DB1'].LastBackupDate = 0 + + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Not -Throw + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 3 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 1 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly + } + + It 'Should throw the correct error when it fails to perform a full backup' { + Mock -CommandName Backup-SqlDatabase -MockWith { throw } -Verifiable -ParameterFilter { $BackupAction -eq 'Database' } + + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw 'The operation on the database ''DB1'' failed with the following errors: System.Management.Automation.RuntimeException: ScriptHalted' + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly + } + + It 'Should throw the correct error when it fails to perform a log backup' { + Mock -CommandName Backup-SqlDatabase -MockWith { throw } -Verifiable -ParameterFilter { $BackupAction -eq 'Log' } + + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw 'The operation on the database ''DB1'' failed with the following errors: System.Management.Automation.RuntimeException: ScriptHalted' + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly + } + + It 'Should throw the correct error when it fails to add the database to the primary replica' { + Mock -CommandName Add-SqlAvailabilityDatabase -MockWith { throw } -Verifiable -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw 'The operation on the database ''DB1'' failed with the following errors: System.Management.Automation.RuntimeException: ScriptHalted' + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly + } + + It 'Should throw the correct error when it fails to add the database to the primary replica' { + Mock -CommandName Add-SqlAvailabilityDatabase -MockWith { throw } -Verifiable -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw 'The operation on the database ''DB1'' failed with the following errors: System.Management.Automation.RuntimeException: ScriptHalted' + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 3 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 1 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly + } + } + + Context 'When Ensure is Absent' { + BeforeEach { + $mockSetTargetResourceParameters.Ensure = 'Absent' + } + + It 'Should remove the specified databases to the availability group(s)' { + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Not -Throw + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 0 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 2 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 0 -Exactly + } + + It 'Should remove the specified databases to the availability group(s) when the primary replica is on another server' { + $mockSetTargetResourceParameters.AvailabilityGroupName = $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServerName + + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Not -Throw + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 0 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 2 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 0 -Exactly + } + + It 'Should throw the correct error when it fails to remove the database from the availability group' { + Mock -CommandName Remove-SqlAvailabilityDatabase -MockWith { throw } -Verifiable + + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw 'The operation on the database ''DB2'' failed with the following errors: Failed to remove the database from the availability group.' + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 0 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 2 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 0 -Exactly + } + } + + Context 'When Ensure is Present and Force is True' { + BeforeEach { + $mockSetTargetResourceParameters.Ensure = 'Present' + $mockSetTargetResourceParameters.Force = $true + } + + It 'Should ensure the database membership of the availability group is exactly as specified' { + { Set-TargetResource @mockSetTargetResourceParameters } | Should -Not -Throw + + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } + Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } + Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 3 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase + Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 1 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs + Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } + Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } + Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly + Assert-MockCalled -CommandName Remove-Item -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly + } + } + } + + Describe 'SqlAGDatabases\Test-TargetResource' { + BeforeAll { + Mock -CommandName Connect-SQL -MockWith { return $mockServerObject } -Verifiable + Mock -CommandName Get-PrimaryReplicaServerObject -MockWith { return $mockServerObject } -Verifiable -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Mock -CommandName Get-PrimaryReplicaServerObject -MockWith { return $mockServer2Object } -Verifiable -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Mock -CommandName Test-ActiveNode -MockWith { + return -not $mockProcessOnlyOnActiveNode + } -Verifiable + } + + BeforeEach { + $mockTestTargetResourceParameters = @{ + DatabaseName = $mockDatabaseNameParameter.Clone() + SqlServer = $mockServerObject.DomainInstanceName + SQLInstanceName = 'MSSQLSERVER' + AvailabilityGroupName = $mockAvailabilityGroupObject.Name + BackupPath = $($mockBackupPath) + Ensure = 'Present' + Force = $false + MatchDatabaseOwner = $false + ProcessOnlyOnActiveNode = $false + } + } + + Context 'When Ensure is Present' { + It 'Should return $true when the configuration is in the desired state' { + $mockTestTargetResourceParameters.DatabaseName = $mockAvailabilityDatabaseNames.Clone() + + Test-TargetResource @mockTestTargetResourceParameters | Should -Be $true + + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Test-ActiveNode -Scope It -Times 1 -Exactly + } + + It 'Should return $false when the specified availability group is not found' { + $mockTestTargetResourceParameters.AvailabilityGroupName = 'NonExistentAvailabilityGroup' + + Test-TargetResource @mockTestTargetResourceParameters | Should -Be $false + + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Test-ActiveNode -Scope It -Times 1 -Exactly + } + + It 'Should return $false when no matching databases are found' { + $mockTestTargetResourceParameters.DatabaseName = $mockDatabaseNameParameterWithNonExistingDatabases.Clone() + + Test-TargetResource @mockTestTargetResourceParameters | Should -Be $false + + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Test-ActiveNode -Scope It -Times 1 -Exactly + } + + It 'Should return $false when databases are found to add to the availability group' { + Test-TargetResource @mockTestTargetResourceParameters | Should -Be $false + + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Test-ActiveNode -Scope It -Times 1 -Exactly + } + + It 'Should return $true when the configuration is in the desired state and the primary replica is on another server' { + $mockTestTargetResourceParameters.DatabaseName = $mockAvailabilityDatabaseNames.Clone() + $mockTestTargetResourceParameters.AvailabilityGroupName = $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.Name + + Test-TargetResource @mockTestTargetResourceParameters | Should -Be $true + + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Test-ActiveNode -Scope It -Times 1 -Exactly + } + + It 'Should return $true when ProcessOnlyOnActiveNode is "$true" and the current node is not actively hosting the instance' { + $mockProcessOnlyOnActiveNode = $true + + $mockTestTargetResourceParameters.DatabaseName = $mockAvailabilityDatabaseNames.Clone() + $mockTestTargetResourceParameters.ProcessOnlyOnActiveNode = $mockProcessOnlyOnActiveNode + + Test-TargetResource @mockTestTargetResourceParameters | Should -Be $true + + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + Assert-MockCalled -CommandName Test-ActiveNode -Scope It -Times 1 -Exactly + } + } + + Context 'When Ensure is Absent' { + BeforeEach { + $mockTestTargetResourceParameters.Ensure = 'Absent' + } + + It 'Should return $true when the configuration is in the desired state' { + $mockTestTargetResourceParameters.DatabaseName = $mockDatabaseNameParameterWithNonExistingDatabases.Clone() + + Test-TargetResource @mockTestTargetResourceParameters | Should -Be $true + + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + + } + + It 'Should return $true when no matching databases are found' { + $mockTestTargetResourceParameters.DatabaseName = $mockDatabaseNameParameterWithNonExistingDatabases.Clone() + + Test-TargetResource @mockTestTargetResourceParameters | Should -Be $true + + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + } + + It 'Should return $false when databases are found to remove from the availability group' { + Test-TargetResource @mockTestTargetResourceParameters | Should -Be $false + + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + } + + It 'Should return $true when the configuration is in the desired state and the primary replica is on another server' { + $mockTestTargetResourceParameters.DatabaseName = $mockDatabaseNameParameterWithNonExistingDatabases.Clone() + $mockTestTargetResourceParameters.AvailabilityGroupName = $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.Name + + Test-TargetResource @mockTestTargetResourceParameters | Should -Be $true + + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + } + } + + Context 'When Ensure is Present and Force is True' { + BeforeEach { + $mockTestTargetResourceParameters.Force = $true + } + + It 'Should return $true when the configuration is in the desired state' { + $mockTestTargetResourceParameters.DatabaseName = $mockAvailabilityDatabaseNames.Clone() + + Test-TargetResource @mockTestTargetResourceParameters | Should -Be $true + + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + } + + It 'Should return $false when no matching databases are found' { + $mockTestTargetResourceParameters.DatabaseName = $mockDatabaseNameParameterWithNonExistingDatabases.Clone() + + Test-TargetResource @mockTestTargetResourceParameters | Should -Be $false + + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + } + + It 'Should return $false when databases are found to add to the availability group' { + Test-TargetResource @mockTestTargetResourceParameters | Should -Be $false + + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + } + + It 'Should return $false when databases are found to remove from the availability group' { + Test-TargetResource @mockTestTargetResourceParameters | Should -Be $false + + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + } + + It 'Should return $true when the configuration is in the desired state and the primary replica is on another server' { + $mockTestTargetResourceParameters.DatabaseName = $mockAvailabilityDatabaseNames.Clone() + $mockTestTargetResourceParameters.AvailabilityGroupName = $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.Name + + Test-TargetResource @mockTestTargetResourceParameters | Should -Be $true + + Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } + Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } + } + } + } + + Describe 'SqlAGDatabases\Get-DatabasesToAddToAvailabilityGroup' { + BeforeEach { + $getDatabasesToAddToAvailabilityGroup = @{ + DatabaseName = $mockDatabaseNameParameter.Clone() + Ensure = 'Present' + ServerObject = $mockServerObject + AvailabilityGroup = $mockAvailabilityGroupObject + } + } + + Context 'When Ensure is Present' { + It 'Should return an array of database names to add when matches are found' { + $results = Get-DatabasesToAddToAvailabilityGroup @getDatabasesToAddToAvailabilityGroup + + foreach ( $result in $results ) + { + $mockAvailabilityDatabasePresentResults -contains $result | Should -Be $true + } + } + + It 'Should return an array of database names no databases are in the availability group' { + $getDatabasesToAddToAvailabilityGroup.AvailabilityGroup = $mockAvailabilityGroupWithoutDatabasesObject + + $results = Get-DatabasesToAddToAvailabilityGroup @getDatabasesToAddToAvailabilityGroup + + foreach ( $result in $results ) + { + $mockPresentDatabaseNames -contains $result | Should -Be $true + } + } + + It 'Should return an empty object when no matches are found' { + $getDatabasesToAddToAvailabilityGroup.DatabaseName = @() + + Get-DatabasesToAddToAvailabilityGroup @getDatabasesToAddToAvailabilityGroup | Should -BeNullOrEmpty + } + } + } + + Describe 'SqlAGDatabases\Get-DatabasesToRemoveFromAvailabilityGroup' { + BeforeEach { + $getDatabasesToRemoveFromAvailabilityGroupParameters = @{ + DatabaseName = $mockDatabaseNameParameter.Clone() + Ensure = 'Present' + Force = $false + ServerObject = $mockServerObject + AvailabilityGroup = $mockAvailabilityGroupObject + } + } + + Context 'When Ensure is Absent' { + BeforeEach { + $getDatabasesToRemoveFromAvailabilityGroupParameters.Ensure = 'Absent' + } + + It 'Should return an array of database names to remove when matches are found' { + $results = Get-DatabasesToRemoveFromAvailabilityGroup @getDatabasesToRemoveFromAvailabilityGroupParameters + + foreach ( $result in $results ) + { + $mockAvailabilityDatabaseAbsentResults -contains $result | Should -Be $true + } + } + + It 'Should return an array of database names to remove when no databases are in the availability group' { + $getDatabasesToRemoveFromAvailabilityGroupParameters.AvailabilityGroup = $mockAvailabilityGroupWithoutDatabasesObject + + $results = Get-DatabasesToRemoveFromAvailabilityGroup @getDatabasesToRemoveFromAvailabilityGroupParameters + + foreach ( $result in $results ) + { + $mockAvailabilityDatabaseAbsentResults -contains $result | Should -Be $true + } + } + + It 'Should return an empty object when no matches are found' { + $getDatabasesToRemoveFromAvailabilityGroupParameters.DatabaseName = @() + + Get-DatabasesToRemoveFromAvailabilityGroup @getDatabasesToRemoveFromAvailabilityGroupParameters | Should -BeNullOrEmpty + } + } + + Context 'When Ensure is Present and Force is True' { + BeforeEach { + $getDatabasesToRemoveFromAvailabilityGroupParameters.Force = $true + } + + It 'Should return an array of database names to remove when matches are found' { + $results = Get-DatabasesToRemoveFromAvailabilityGroup @getDatabasesToRemoveFromAvailabilityGroupParameters + + foreach ( $result in $results ) + { + $mockAvailabilityDatabaseExactlyRemoveResults -contains $result | Should -Be $true + } + } + + It 'Should return all of the databases in the availability group if no matches were found' { + $getDatabasesToRemoveFromAvailabilityGroupParameters.DatabaseName = @() + + $results = Get-DatabasesToRemoveFromAvailabilityGroup @getDatabasesToRemoveFromAvailabilityGroupParameters + + # Ensure all of the results are in the Availability Databases + foreach ( $result in $results ) + { + $mockAvailabilityDatabaseNames -contains $result | Should -Be $true + } + + # Ensure all of the Availability Databases are in the results + foreach ( $mockAvailabilityDatabaseName in $mockAvailabilityDatabaseNames ) + { + $results -contains $mockAvailabilityDatabaseName | Should -Be $true + } + } + } + } + + Describe 'SqlAGDatabases\Get-MatchingDatabaseNames' { + BeforeEach { + $getMatchingDatabaseNamesParameters = @{ + DatabaseName = $mockDatabaseNameParameter.Clone() + ServerObject = $mockServerObject + } + } + + Context 'When the Get-MatchingDatabaseNames function is called' { + It 'Should throw the correct error when and invalid object type is passed to the method' { + $getMatchingDatabaseNamesParameters.ServerObject = $mockBadServerObject + + { Get-MatchingDatabaseNames @getMatchingDatabaseNamesParameters } | Should -Throw 'ServerObject' + } + + It 'Should return an empty object when no matching databases are found' { + $getMatchingDatabaseNamesParameters.DatabaseName = @('DatabaseNotHere') + + Get-MatchingDatabaseNames @getMatchingDatabaseNamesParameters | Should -BeNullOrEmpty + } + + It 'Should return an array of database names that match the defined databases' { + $results = Get-MatchingDatabaseNames @getMatchingDatabaseNamesParameters + + foreach ( $result in $results ) + { + $mockPresentDatabaseNames -contains $result | Should -Be $true + } + } + } + } + + Describe 'SqlAGDatabases\Get-DatabaseNamesNotFoundOnTheInstance' { + Context 'When the Get-DatabaseNamesNotFoundOnTheInstance function is called' { + BeforeAll { + # The defined databases that should be identified as missing + $mockMissingDatabases = @( + 'AnotherDB' + '4th*OfDatabase' + ) + } + + BeforeEach { + $getDatabaseNamesNotFoundOnTheInstanceParameters = @{ + DatabaseName = $mockDatabaseNameParameter.Clone() + MatchingDatabaseNames = @() + } + } + + It 'Should return an empty object when no missing databases were identified' { + $getDatabaseNamesNotFoundOnTheInstanceParameters.MatchingDatabaseNames = $mockDatabaseNameParameter + + Get-DatabaseNamesNotFoundOnTheInstance @getDatabaseNamesNotFoundOnTheInstanceParameters | Should -BeNullOrEmpty + } + + It 'Should return a string array of database names when missing databases are identified' { + $getDatabaseNamesNotFoundOnTheInstanceParameters.MatchingDatabaseNames = $mockPresentDatabaseNames + + $results = Get-DatabaseNamesNotFoundOnTheInstance @getDatabaseNamesNotFoundOnTheInstanceParameters + + foreach ( $result in $results ) + { + $mockMissingDatabases -contains $result | Should -Be $true + } + } + + It 'Should return an empty object is supplied and no databases are defined' { + $getDatabaseNamesNotFoundOnTheInstanceParameters.DatabaseName = @() + $getDatabaseNamesNotFoundOnTheInstanceParameters.MatchingDatabaseNames = $mockPresentDatabaseNames + + Get-DatabaseNamesNotFoundOnTheInstance @getDatabaseNamesNotFoundOnTheInstanceParameters | Should -BeNullOrEmpty + } + } + } + } +} +finally +{ + Invoke-TestCleanup + +} diff --git a/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 b/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 index 9c2ae885f..4deb07a91 100644 --- a/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 @@ -93,7 +93,11 @@ try #endregion Pester Test Initialization +<<<<<<< HEAD:Tests/Unit/MSFT_SqlAGListener.Tests.ps1 Describe 'SqlServerAGListener\Get-TargetResource' { +======= + Describe 'SqlServerDSCAvailabilityGroupListener\Get-TargetResource' { +>>>>>>> first pass at complete rename:Tests/Unit/MSFT_SqlAGListener.Tests.ps1 BeforeEach { $testParameters = $defaultParameters.Clone() @@ -224,7 +228,11 @@ try Assert-VerifiableMock } +<<<<<<< HEAD:Tests/Unit/MSFT_SqlAGListener.Tests.ps1 Describe 'SqlServerAGListener\Test-TargetResource' { +======= + Describe 'SqlServerDSCAvailabilityGroupListener\Test-TargetResource' { +>>>>>>> first pass at complete rename:Tests/Unit/MSFT_SqlAGListener.Tests.ps1 BeforeEach { $testParameters = $defaultParameters.Clone() } @@ -509,7 +517,11 @@ try Assert-VerifiableMock } +<<<<<<< HEAD:Tests/Unit/MSFT_SqlAGListener.Tests.ps1 Describe 'SqlServerAGListener\Set-TargetResource' { +======= + Describe 'SqlServerDSCAvailabilityGroupListener\Set-TargetResource' { +>>>>>>> first pass at complete rename:Tests/Unit/MSFT_SqlAGListener.Tests.ps1 BeforeEach { $testParameters = $defaultParameters.Clone() diff --git a/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 b/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 new file mode 100644 index 000000000..164d0c49e --- /dev/null +++ b/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 @@ -0,0 +1,731 @@ +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlServerServiceAccount' + +#region HEADER + +# Unit Test Template Version: 1.2.1 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests')) +} + +Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $script:DSCModuleName ` + -DSCResourceName $script:DSCResourceName ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup +{ + # Compile the SMO stubs for use by the unit tests. + Add-Type -Path (Join-Path -Path $script:moduleRoot -ChildPath 'Tests\Unit\Stubs\SMO.cs') +} + +function Invoke-TestCleanup { + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope $script:DSCResourceName { + + $mockSqlServer = 'TestServer' + $mockDefaultInstanceName = 'MSSQLSERVER' + $mockNamedInstance = 'TestInstance' + $mockServiceType = 'DatabaseEngine' + $mockDesiredServiceAccountName = 'CONTOSO\sql.service' + $mockServiceAccountCredential = (New-Object -TypeName System.Management.Automation.PSCredential $mockDesiredServiceAccountName, (New-Object -TypeName System.Security.SecureString)) + $mockDefaultServiceAccountName = 'NT SERVICE\MSSQLSERVER' + $mockDefaultServiceAccountCredential = (New-Object -TypeName System.Management.Automation.PSCredential $mockDefaultServiceAccountName, (New-Object -TypeName System.Security.SecureString)) + $mockLocalServiceAccountName = "$($mockSqlServer)\SqlService" + $mockLocalServiceAccountCredential = (New-Object -TypeName System.Management.Automation.PSCredential $mockLocalServiceAccountName, (New-Object -TypeName System.Security.SecureString)) + + # Stores the result of SetServiceAccount calls + $testServiceAccountUpdated = @{ + Processed = $false + NewUserAccount = [System.String]::Empty + NewPassword = [System.String]::Emtpy + } + + # Script block for changing the service account in mocks + $mockSetServiceAccount = { + param + ( + [System.String] + $User, + + [System.String] + $Password + ) + + # Update the object + $testServiceAccountUpdated.Processed = $true + $testServiceAccountUpdated.NewUserAccount = $User + $testServiceAccountUpdated.NewPassword = $Password + } + + # Script block to throw an exception when changing a service account. + $mockSetServiceAccount_Exception = { + param + ( + [System.String] + $User, + + [System.String] + $Password + ) + + throw (New-Object -TypeName Microsoft.SqlServer.Management.Smo.FailedOperationException 'SetServiceAccount') + } + + # Splat for creating the SetServiceAccount method + $mockAddMemberParameters_SetServiceAccount = @{ + Name = 'SetServiceAccount' + MemberType = 'ScriptMethod' + Value = $mockSetServiceAccount + } + + $mockAddMemberParameters_SetServiceAccount_Exception = @{ + Name = 'SetServiceAccount' + MemberType = 'ScriptMethod' + Value = $mockSetServiceAccount_Exception + } + + # Used to mock ManagedComputer object for a default instance + $mockNewObject_ManagedComputer_DefaultInstance = { + $managedComputerObject = New-Object -TypeName PSObject -Property @{ + Name = $mockSqlServer + Services = @( + New-Object -TypeName PSObject -Property @{ + Name = $mockDefaultInstanceName + ServiceAccount = $mockDefaultServiceAccountName + Type = 'SqlServer' + } + ) + } + + $managedComputerObject.Services | ForEach-Object { + $_ | Add-Member @mockAddMemberParameters_SetServiceAccount + } + + return $managedComputerObject + } + + # Creates a new ManagedComputer object for a default instance with a local service account + $mockNewObject_ManagedComputer_DefaultInstance_LocalServiceAccount = { + $managedComputerObject = New-Object -TypeName PSObject -Property @{ + Name = $mockSqlServer + Services = @( + New-Object -TypeName PSObject -Property @{ + Name = $mockDefaultInstanceName + ServiceAccount = ($mockLocalServiceAccountName -replace $mockSqlServer,'.') + Type = 'SqlServer' + } + ) + } + + $managedComputerObject.Services | ForEach-Object { + $_ | Add-Member @mockAddMemberParameters_SetServiceAccount + } + + return $managedComputerObject + } + + <# + Creates a new ManagedComputer object for a default instance that thows an exception + when attempting to set the service account + #> + $mockNewObject_ManagedComputer_DefaultInstance_SetServiceAccountException = { + $managedComputerObject = New-Object -TypeName PSObject -Property @{ + Name = $mockSqlServer + Services = @( + New-Object -TypeName PSObject -Property @{ + Name = $mockDefaultInstanceName + ServiceAccount = $mockDefaultServiceAccountName + Type = 'SqlServer' + } + ) + } + + $managedComputerObject.Services | ForEach-Object { + $_ | Add-Member @mockAddMemberParameters_SetServiceAccount_Exception + } + + return $managedComputerObject + } + + # Used to mock a ManagedComputer object for a named instance + $mockNewObject_ManagedComputer_NamedInstance = { + $managedComputerObject = New-Object -TypeName PSObject -Property @{ + Name = $mockSqlServer + Services = @( + New-Object -TypeName PSObject -Property @{ + Name = ('MSSQL${0}' -f $mockNamedInstance) + ServiceAccount = $mockDesiredServiceAccountName + Type = 'SqlServer' + } + ) + } + + $managedComputerObject.Services | ForEach-Object { + $_ | Add-Member @mockAddMemberParameters_SetServiceAccount + } + + return $managedComputerObject + } + + # Used to mock a ManagedComputer object that fails to change the service account + $mockNewObject_ManagedComputer_NamedInstance_SetServiceAccountException = { + $managedComputerObject = New-Object -TypeName PSObject -Property @{ + Name = $mockSqlServer + Services = @( + New-Object -TypeName PSObject -Property @{ + Name = ('MSSQL${0}' -f $mockNamedInstance) + ServiceAccount = $mockDesiredServiceAccountName + Type = 'SqlServer' + } + ) + } + + $managedComputerObject.Services | ForEach-Object { + $_ | Add-Member @mockAddMemberParameters_SetServiceAccount_Exception + } + + return $managedComputerObject + } + + # Parameter filter for mocks of New-Object + $mockNewObject_ParameterFilter = { + $TypeName -eq 'Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer' + } + + # Splat to simplify creation of Mock for New-Object with a default instance + $mockNewObjectParameters_DefaultInstance = @{ + CommandName = 'New-Object' + MockWith = $mockNewObject_ManagedComputer_DefaultInstance + ParameterFilter = $mockNewObject_ParameterFilter + Verifiable = $true + } + + # Splat to simplify creation of Mock for New-Object with a named instance + $mockNewObjectParameters_NamedInstance = @{ + CommandName = 'New-Object' + MockWith = $mockNewObject_ManagedComputer_NamedInstance + ParameterFilter = $mockNewObject_ParameterFilter + Verifiable = $true + } + + Describe 'MSFT_SqlServerServiceAccount\ConvertTo-ManagedServiceType' -Tag 'Helper' { + Context 'Translating service types' { + $testCases = @( + @{ + ServiceType = 'DatabaseEngine' + ExpectedType = 'SqlServer' + } + + @{ + ServiceType = 'SQLServerAgent' + ExpectedType = 'SqlAgent' + } + + @{ + ServiceType = 'Search' + ExpectedType = 'Search' + } + + @{ + ServiceType = 'IntegrationServices' + ExpectedType = 'SqlServerIntegrationService' + } + + @{ + ServiceType = 'AnalysisServices' + ExpectedType = 'AnalysisServer' + } + + @{ + ServiceType = 'ReportingServices' + ExpectedType = 'ReportServer' + } + + @{ + ServiceType = 'SQLServerBrowser' + ExpectedType = 'SqlBrowser' + } + + @{ + ServiceType = 'NotificationServices' + ExpectedType = 'NotificationServer' + } + ) + + It 'Should properly map to ManagedServiceType->' -TestCases $testCases { + param + ( + [System.String] + $ServiceType, + + [System.String] + $ExpectedType + ) + + # Get the ManagedServiceType + $managedServiceType = ConvertTo-ManagedServiceType -ServiceType $ServiceType + + $managedServiceType | Should -BeOfType Microsoft.SqlServer.Management.Smo.Wmi.ManagedServiceType + $managedServiceType | Should -Be $ExpectedType + } + } + } + + Describe 'MSFT_SqlServerServiceAccount\Get-ServiceObject' -Tag 'Helper' { + Mock -CommandName Import-SQLPSModule -Verifiable + + $defaultGetServiceObjectParameters = @{ + SQLServer = $mockSqlServer + SQLInstanceName = '' + ServiceType = $mockServiceType + } + + Context 'When getting the service information for a default instance' { + Mock @mockNewObjectParameters_DefaultInstance + + It 'Should have the correct Type for the service' { + $getServiceObjectParameters = $defaultGetServiceObjectParameters.Clone() + $getServiceObjectParameters.SQLInstanceName = $mockDefaultInstanceName + + $serviceObject = Get-ServiceObject @getServiceObjectParameters + $serviceObject.Type | Should -Be 'SqlServer' + + # Ensure mocks are properly used + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 + Assert-MockCalled -CommandName New-Object -Scope It -Exactly -Times 1 + } + } + + Context 'When getting the service information for a named instance' { + Mock @mockNewObjectParameters_NamedInstance + + It 'Should have the correct Type for the service' { + $getServiceObjectParameters = $defaultGetServiceObjectParameters.Clone() + $getServiceObjectParameters.SQLInstanceName = $mockNamedInstance + + $serviceObject = Get-ServiceObject @getServiceObjectParameters + $serviceObject.Type | Should -Be 'SqlServer' + + # Ensure mocks are properly used + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 + Assert-MockCalled -CommandName New-Object -Scope It -Exactly -Times 1 + } + } + } + + Describe 'MSFT_SqlServerServiceAccount\Get-TargetResource' -Tag 'Get' { + Mock -CommandName Import-SQLPSModule -Verifiable + + Context 'When getting the service information for a default instance' { + Mock @mockNewObjectParameters_DefaultInstance + + $defaultGetTargetResourceParameters = @{ + SQLServer = $mockSqlServer + SQLInstanceName = $mockDefaultInstanceName + ServiceType = $mockServiceType + ServiceAccount = $mockDefaultServiceAccountCredential + } + + It 'Should return the correct service information' { + # Get the service information + $testServiceInformation = Get-TargetResource @defaultGetTargetResourceParameters + + # Validate the hashtable returned + $testServiceInformation.SQLServer | Should -Be $mockSqlServer + $testServiceInformation.SQLInstanceName | Should -Be $mockDefaultInstanceName + $testServiceInformation.ServiceType | Should -Be 'SqlServer' + $testServiceInformation.ServiceAccount | Should -Be $mockDefaultServiceAccountName + + # Ensure mocks were properly used + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 + } + + It 'Should throw the correct exception when an invalid ServiceType and InstanceName are specified' { + $getTargetResourceParameters = $defaultGetTargetResourceParameters.Clone() + $getTargetResourceParameters.ServiceType = 'SQLServerAgent' + + { Get-TargetResource @getTargetResourceParameters } | + Should -Throw "The SQLServerAgent service on $($mockSqlServer)\$($mockDefaultInstanceName) could not be found." + + # Ensure mocks were properly used + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 + } + } + + Context 'When getting the service information for a named instance' { + Mock @mockNewObjectParameters_NamedInstance + + # Splat the function parameters + $defaultGetTargetResourceParameters = @{ + SQLServer = $mockSqlServer + SQLInstanceName = $mockNamedInstance + ServiceType = $mockServiceType + ServiceAccount = $mockServiceAccountCredential + } + + It 'Should return the correct service information' { + # Get the service information + $testServiceInformation = Get-TargetResource @defaultGetTargetResourceParameters + + # Validate the hashtable returned + $testServiceInformation.SQLServer | Should -Be $mockSqlServer + $testServiceInformation.SQLInstanceName | Should -Be $mockNamedInstance + $testServiceInformation.ServiceType | Should -Be 'SqlServer' + $testServiceInformation.ServiceAccount | Should -Be $mockDesiredServiceAccountName + + # Ensure mocks were properly used + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 + } + + It 'Should throw the correct exception when an invalid ServiceType and InstanceName are specified' { + $getTargetResourceParameters = $defaultGetTargetResourceParameters.Clone() + $getTargetResourceParameters.ServiceType = 'SQLServerAgent' + + { Get-TargetResource @getTargetResourceParameters } | + Should -Throw "The SQLServerAgent service on $($mockSqlServer)\$($mockNamedInstance) could not be found." + + # Ensure mocks were properly used + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 + } + } + + Context 'When the service account is local to the machine' { + $mockNewObjectParameters = $mockNewObjectParameters_DefaultInstance.Clone() + $mockNewObjectParameters.MockWith = $mockNewObject_ManagedComputer_DefaultInstance_LocalServiceAccount + + Mock @mockNewObjectParameters + + $defaultGetTargetResourceParameters = @{ + SQLServer = $mockSqlServer + SQLInstanceName = $mockDefaultInstanceName + ServiceType = $mockServiceType + ServiceAccount = $mockLocalServiceAccountCredential + } + + It 'Should have the same domain name as the computer name' { + $currentState = Get-TargetResource @defaultGetTargetResourceParameters + + # Validate the service account + $currentState.ServiceAccount | Should -Be $mockLocalServiceAccountName + + # Ensure mocks were properly used + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 + } + } + } + + Describe 'MSFT_SqlServerServiceAccount\Test-TargetResource' -Tag 'Test' { + Mock -CommandName Import-SQLPSModule -Verifiable + + Context 'When the system is not in the desired state for a default instance' { + Mock @mockNewObjectParameters_DefaultInstance + + It 'Should return false' { + $testTargetResourceParameters = @{ + SQLServer = $mockSqlServer + SQLInstanceName = $mockDefaultInstanceName + ServiceType = $mockServiceType + ServiceAccount = $mockServiceAccountCredential + } + + Test-TargetResource @testTargetResourceParameters | Should -Be $false + + # Ensure mocks are properly used + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 + } + } + + Context 'When the system is in the desired state or a default instance' { + Mock @mockNewObjectParameters_DefaultInstance + + It 'Should return true' { + $testTargetResourceParameters = @{ + SQLServer = $mockSqlServer + SQLInstanceName = $mockDefaultInstanceName + ServiceType = $mockServiceType + ServiceAccount = $mockDefaultServiceAccountCredential + } + + Test-TargetResource @testTargetResourceParameters | Should -Be $true + + # Ensure mocks are properly used + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 + } + } + + Context 'When the system is in the desired state and Force is specified' { + Mock @mockNewObjectParameters_DefaultInstance + + It 'Should return False when Force is specified' { + $testTargetResourceParameters = @{ + SQLServer = $mockSqlServer + SQLInstanceName = $mockDefaultInstanceName + ServiceType = $mockServiceType + ServiceAccount = $mockServiceAccountCredential + Force = $true + } + + Test-TargetResource @testTargetResourceParameters | Should -Be $false + + # Ensure mocks are properly used + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 0 + } + } + + Context 'When the system is not in the desired state for a named instance' { + Mock @mockNewObjectParameters_NamedInstance + + It 'Should return false' { + $testTargetResourceParameters = @{ + SQLServer = $mockSqlServer + SQLInstanceName = $mockNamedInstance + ServiceType = $mockServiceType + ServiceAccount = $mockDefaultServiceAccountCredential + } + + Test-TargetResource @testTargetResourceParameters | Should -Be $false + + # Ensure mocks are properly used + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 + } + } + + Context 'When the system is in the desired state for a named instance' { + Mock @mockNewObjectParameters_NamedInstance + + It 'Should return true' { + $testTargetResourceParameters = @{ + SQLServer = $mockSqlServer + SQLInstanceName = $mockNamedInstance + ServiceType = $mockServiceType + ServiceAccount = $mockServiceAccountCredential + } + + Test-TargetResource @testTargetResourceParameters | Should -Be $true + + # Ensure mocks are properly used + Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 + } + } + + Context 'When the system is in the desired state for a named instance and Force is specified' { + Mock @mockNewObjectParameters_NamedInstance + + It 'Should return false' { + $testTargetResourceParameters = @{ + SQLServer = $mockSqlServer + SQLInstanceName = $mockNamedInstance + ServiceType = $mockServiceType + ServiceAccount = $mockServiceAccountCredential + Force = $true + } + + # Validate the return value + Test-TargetResource @testTargetResourceParameters | Should -Be $false + + # Ensure mocks are properly used + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 0 + } + } + } + + Describe 'MSFT_SqlServerServiceAccount\Set-TargetResource' -Tag 'Set' { + Mock -CommandName Import-SQLPSModule -Verifiable + + Context 'When changing the service account for the default instance' { + BeforeAll { + $defaultSetTargetResourceParameters = @{ + SQLServer = $mockSqlServer + SQLInstanceName = $mockDefaultInstanceName + ServiceType = $mockServiceType + ServiceAccount = $mockDefaultServiceAccountCredential + } + + Mock @mockNewObjectParameters_DefaultInstance + + Mock -CommandName Restart-SqlService -Verifiable + } + + BeforeEach { + $testServiceAccountUpdated.Processed = $false + $testServiceAccountUpdated.NewUserAccount = [System.String]::Empty + $testServiceAccountUpdated.NewPassword = [System.String]::Empty + } + + It 'Should update the service account information' { + $setTargetResourceParameters = $defaultSetTargetResourceParameters.Clone() + + # Update the service information + Set-TargetResource @setTargetResourceParameters + + # Validate that the correct information was passed through and updated + $testServiceAccountUpdated.Processed | Should -Be $true + $testServiceAccountUpdated.NewUserAccount | Should -Be $setTargetResourceParameters.ServiceAccount.Username + $testServiceAccountUpdated.NewPassword | Should -Be $setTargetResourceParameters.ServiceAccount.GetNetworkCredential().Password + + # Ensure mocks are used properly + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 + Assert-MockCalled -CommandName Restart-SqlService -Scope It -Exactly -Times 0 + } + + It 'Should throw the correct exception when an invalid service name and type is provided' { + $setTargetResourceParameters = $defaultSetTargetResourceParameters.Clone() + $setTargetResourceParameters.ServiceType = 'SQLServerAgent' + + # Get the localized error message + $mockCorrectErrorMessage = $script:localizedData.ServiceNotFound -f $setTargetResourceParameters.ServiceType, $setTargetResourceParameters.SQLServer, $setTargetResourceParameters.SQLInstanceName + + # Attempt to update the service account + { Set-TargetResource @setTargetResourceParameters } | Should -Throw $mockCorrectErrorMessage + + # Ensure mocks are used properly + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 + Assert-MockCalled -CommandName Restart-SqlService -Scope It -Exactly -Times 0 + } + + It 'Should restart the service if requested' { + $setTargetResourceParameters = $defaultSetTargetResourceParameters.Clone() + $setTargetResourceParameters += @{ + RestartService = $true + } + + Set-TargetResource @setTargetResourceParameters + + # Ensure mocks are used properly + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 + Assert-MockCalled -CommandName Restart-SqlService -Scope It -Exactly -Times 1 + } + + It 'Should throw the correct exception if SetServiceAccount call fails' { + $newObjectParms = $mockNewObjectParameters_DefaultInstance.Clone() + $newObjectParms.MockWith = $mockNewObject_ManagedComputer_DefaultInstance_SetServiceAccountException + + Mock @newObjectParms + + $setTargetResourceParameters = $defaultSetTargetResourceParameters.Clone() + + # Get the localized error message + $mockCorrectErrorMessage = $script:localizedData.SetServiceAccountFailed -f $setTargetResourceParameters.SQLServer, $setTargetResourceParameters.SQLInstanceName, '' + + # Attempt to update the service account + { Set-TargetResource @setTargetResourceParameters } | Should -Throw $mockCorrectErrorMessage + + # Ensure mocks are used properly + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 + Assert-MockCalled -CommandName Restart-SqlService -Scope It -Exactly -Times 0 + } + } + + Context 'When changing the service account for the default instance' { + BeforeAll { + $defaultSetTargetResourceParameters = @{ + SQLServer = $mockSqlServer + SQLInstanceName = $mockNamedInstance + ServiceType = $mockServiceType + ServiceAccount = $mockDefaultServiceAccountCredential + } + + Mock @mockNewObjectParameters_NamedInstance + + Mock -CommandName Restart-SqlService -Verifiable + } + + BeforeEach { + $testServiceAccountUpdated.Processed = $false + $testServiceAccountUpdated.NewUserAccount = [System.String]::Empty + $testServiceAccountUpdated.NewPassword = [System.String]::Empty + } + + It 'Should update the service account information' { + $setTargetResourceParameters = $defaultSetTargetResourceParameters.Clone() + + # Update the service information + Set-TargetResource @setTargetResourceParameters + + # Validate that the correct information was passed through and updated + $testServiceAccountUpdated.Processed | Should -Be $true + $testServiceAccountUpdated.NewUserAccount | Should -Be $setTargetResourceParameters.ServiceAccount.Username + $testServiceAccountUpdated.NewPassword | Should -Be $setTargetResourceParameters.ServiceAccount.GetNetworkCredential().Password + + # Ensure mocks are used properly + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 + Assert-MockCalled -CommandName Restart-SqlService -Scope It -Exactly -Times 0 + } + + It 'Should throw the correct exception when an invalid service name and type is provided' { + $setTargetResourceParameters = $defaultSetTargetResourceParameters.Clone() + $setTargetResourceParameters.ServiceType = 'SQLServerAgent' + + # Get the expected localized error message + $mockCorrectErrorMessage = $script:localizedData.ServiceNotFound -f $setTargetResourceParameters.ServiceType, $setTargetResourceParameters.SQLServer, $setTargetResourceParameters.SQLInstanceName + + # Attempt to update the service account + { Set-TargetResource @setTargetResourceParameters } | Should -Throw $mockCorrectErrorMessage + + # Ensure mocks are used properly + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 + Assert-MockCalled -CommandName Restart-SqlService -Scope It -Exactly -Times 0 + } + + It 'Should restart the service if requested' { + $setTargetResourceParameters = $defaultSetTargetResourceParameters.Clone() + $setTargetResourceParameters += @{ + RestartService = $true + } + + Set-TargetResource @setTargetResourceParameters + + # Ensure mocks are used properly + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 + Assert-MockCalled -CommandName Restart-SqlService -Scope It -Exactly -Times 1 + } + + It 'Should throw the correct exception if SetServiceAccount call fails' { + $newObjectParms = $mockNewObjectParameters_NamedInstance.Clone() + $newObjectParms.MockWith = $mockNewObject_ManagedComputer_NamedInstance_SetServiceAccountException + + Mock @newObjectParms + + $setTargetResourceParameters = $defaultSetTargetResourceParameters.Clone() + + # Get the expected localized error message + $mockCorrectErrorMessage = $script:localizedData.SetServiceAccountFailed -f $setTargetResourceParameters.SQLServer, $setTargetResourceParameters.SQLInstanceName, '' + + # Attempt to update the service information + { Set-TargetResource @setTargetResourceParameters } | Should -Throw $mockCorrectErrorMessage + + # Ensure mocks are used properly + Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 + Assert-MockCalled -CommandName Restart-SqlService -Scope It -Exactly -Times 0 + } + } + } + } +} +finally +{ + Invoke-TestCleanup +} diff --git a/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 b/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 new file mode 100644 index 000000000..afbaf5be3 --- /dev/null +++ b/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 @@ -0,0 +1,244 @@ +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlWaitForAvailabilityGroup' + +#region HEADER + +# Unit Test Template Version: 1.2.0 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) +} + +Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $script:DSCModuleName ` + -DSCResourceName $script:DSCResourceName ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup { +} + +function Invoke-TestCleanup { + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope $script:DSCResourceName { + $mockClusterGroupName = 'AGTest' + $mockRetryInterval = 1 + $mockRetryCount = 2 + + $mockOtherClusterGroupName = 'UnknownAG' + + # Function stub of Get-ClusterGroup (when we do not have Failover Cluster powershell module available) + function Get-ClusterGroup { + param + ( + # Will contain the cluster group name so mock can bind filters on it. + [Parameter()] + [System.String] + $Name + ) + + throw '{0}: StubNotImplemented' -f $MyInvocation.MyCommand + } + + $mockGetClusterGroup = { + if ($Name -ne $mockExpectedClusterGroupName) + { + throw ('Mock Get-ClusterGroup called with unexpected name. Expected ''{0}'', but was ''{1}''' -f $mockExpectedClusterGroupName, $Name) + } + + return New-Object -TypeName PSObject -Property @{ + Name = $Name + } + } + + $mockGetClusterGroup_ParameterFilter_KnownGroup = { + $Name -eq $mockClusterGroupName + } + + $mockGetClusterGroup_ParameterFilter_UnknownGroup = { + $Name -eq $mockOtherClusterGroupName + } + + # Default parameters that are used for the It-blocks + $mockDefaultParameters = @{ + Name = $mockClusterGroupName + RetryIntervalSec = $mockRetryInterval + RetryCount = $mockRetryCount + } + + Describe 'MSFT_SqlWaitForAvailabilityGroup\Get-TargetResource' -Tag 'Get' { + BeforeEach { + $testParameters = $mockDefaultParameters.Clone() + + Mock -CommandName Get-ClusterGroup -MockWith $mockGetClusterGroup -ParameterFilter $mockGetClusterGroup_ParameterFilter_KnownGroup -Verifiable + Mock -CommandName Get-ClusterGroup -MockWith { + return $null + } -ParameterFilter $mockGetClusterGroup_ParameterFilter_UnknownGroup -Verifiable + } + + Context 'When the system is in the desired state' { + $mockExpectedClusterGroupName = $mockClusterGroupName + + It 'Should return the same values as passed as parameters' { + $result = Get-TargetResource @testParameters + $result.RetryIntervalSec | Should -Be $mockRetryInterval + $result.RetryCount | Should -Be $mockRetryCount + + Assert-MockCalled -CommandName Get-ClusterGroup ` + -ParameterFilter $mockGetClusterGroup_ParameterFilter_KnownGroup ` + -Exactly -Times 1 -Scope It + + Assert-MockCalled -CommandName Get-ClusterGroup ` + -ParameterFilter $mockGetClusterGroup_ParameterFilter_UnknownGroup ` + -Exactly -Times 0 -Scope It + } + + It 'Should return that the group exist' { + $result = Get-TargetResource @testParameters + $result.GroupExist | Should -Be $true + } + } + + Context 'When the system is not in the desired state' { + BeforeEach { + $testParameters.Name = $mockOtherClusterGroupName + } + + $mockExpectedClusterGroupName = $mockOtherClusterGroupName + + It 'Should return the same values as passed as parameters' { + $result = Get-TargetResource @testParameters + $result.RetryIntervalSec | Should -Be $mockRetryInterval + $result.RetryCount | Should -Be $mockRetryCount + + Assert-MockCalled -CommandName Get-ClusterGroup ` + -ParameterFilter $mockGetClusterGroup_ParameterFilter_KnownGroup ` + -Exactly -Times 0 -Scope It + + Assert-MockCalled -CommandName Get-ClusterGroup ` + -ParameterFilter $mockGetClusterGroup_ParameterFilter_UnknownGroup ` + -Exactly -Times 1 -Scope It + } + + It 'Should return that the group does not exist' { + $result = Get-TargetResource @testParameters + $result.GroupExist | Should -Be $false + } + } + + Assert-VerifiableMock + } + + + Describe 'MSFT_SqlWaitForAvailabilityGroup\Test-TargetResource' -Tag 'Test'{ + BeforeEach { + $testParameters = $mockDefaultParameters.Clone() + + Mock -CommandName Get-ClusterGroup -MockWith $mockGetClusterGroup -ParameterFilter $mockGetClusterGroup_ParameterFilter_KnownGroup -Verifiable + Mock -CommandName Get-ClusterGroup -MockWith { + return $null + } -ParameterFilter $mockGetClusterGroup_ParameterFilter_UnknownGroup -Verifiable + } + + Context 'When the system is in the desired state' { + $mockExpectedClusterGroupName = $mockClusterGroupName + + It 'Should return that desired state is present ($true)' { + $result = Test-TargetResource @testParameters + $result | Should -Be $true + + Assert-MockCalled -CommandName Get-ClusterGroup ` + -ParameterFilter $mockGetClusterGroup_ParameterFilter_KnownGroup ` + -Exactly -Times 1 -Scope It + + Assert-MockCalled -CommandName Get-ClusterGroup ` + -ParameterFilter $mockGetClusterGroup_ParameterFilter_UnknownGroup ` + -Exactly -Times 0 -Scope It + } + } + + Context 'When the system is not in the desired state' { + $mockExpectedClusterGroupName = $mockOtherClusterGroupName + + It 'Should return that desired state is absent ($false)' { + $testParameters.Name = $mockOtherClusterGroupName + + $result = Test-TargetResource @testParameters + $result | Should -Be $false + + Assert-MockCalled -CommandName Get-ClusterGroup ` + -ParameterFilter $mockGetClusterGroup_ParameterFilter_KnownGroup ` + -Exactly -Times 0 -Scope It + + Assert-MockCalled -CommandName Get-ClusterGroup ` + -ParameterFilter $mockGetClusterGroup_ParameterFilter_UnknownGroup ` + -Exactly -Times 1 -Scope It + } + } + + Assert-VerifiableMock + } + + Describe 'MSFT_SqlWaitForAvailabilityGroup\Set-TargetResource' -Tag 'Set'{ + BeforeEach { + $testParameters = $mockDefaultParameters.Clone() + + Mock -CommandName Start-Sleep + Mock -CommandName Get-ClusterGroup -MockWith $mockGetClusterGroup -ParameterFilter $mockGetClusterGroup_ParameterFilter_KnownGroup -Verifiable + Mock -CommandName Get-ClusterGroup -MockWith { + return $null + } -ParameterFilter $mockGetClusterGroup_ParameterFilter_UnknownGroup -Verifiable + } + + Context 'When the system is in the desired state' { + $mockExpectedClusterGroupName = $mockClusterGroupName + + It 'Should find the cluster group and return without throwing' { + { Set-TargetResource @testParameters } | Should -Not -Throw + + Assert-MockCalled -CommandName Get-ClusterGroup ` + -ParameterFilter $mockGetClusterGroup_ParameterFilter_KnownGroup ` + -Exactly -Times 1 -Scope It + + Assert-MockCalled -CommandName Get-ClusterGroup ` + -ParameterFilter $mockGetClusterGroup_ParameterFilter_UnknownGroup ` + -Exactly -Times 0 -Scope It } + } + + Context 'When the system is not in the desired state' { + $mockExpectedClusterGroupName = $mockOtherClusterGroupName + + It 'Should throw the correct error message' { + $testParameters.Name = $mockOtherClusterGroupName + + { Set-TargetResource @testParameters } | Should -Throw 'Cluster group UnknownAG not found after 2 attempts with 1 sec interval' + + Assert-MockCalled -CommandName Get-ClusterGroup ` + -ParameterFilter $mockGetClusterGroup_ParameterFilter_KnownGroup ` + -Exactly -Times 0 -Scope It + + Assert-MockCalled -CommandName Get-ClusterGroup ` + -ParameterFilter $mockGetClusterGroup_ParameterFilter_UnknownGroup ` + -Exactly -Times 2 -Scope It } + } + + Assert-VerifiableMock + } + } +} +finally +{ + Invoke-TestCleanup +} diff --git a/en-US/SqlServerDscHelper.strings.psd1 b/en-US/SqlServerDscHelper.strings.psd1 index ab81b005b..2f19578a9 100644 --- a/en-US/SqlServerDscHelper.strings.psd1 +++ b/en-US/SqlServerDscHelper.strings.psd1 @@ -17,7 +17,7 @@ ConvertFrom-StringData @' PropertiesDoesNotMatch = Found an array for property {0} in the current values, but this array does not match the desired state. Details of the changes are below. PropertyThatDoesNotMatch = {0} - {1} ValueOfTypeDoesNotMatch = {0} value for property {1} does not match. Current state is '{2}' and desired state is '{3}'. - UnableToCompareProperty = Unable to compare property {0} as the type {1} is not handled by the Test-SQLDSCParameterState cmdlet. + UnableToCompareProperty = Unable to compare property {0} as the type {1} is not handled by the Test-SQLDscParameterState cmdlet. PreferredModuleFound = Preferred module SqlServer found. PreferredModuleNotFound = Information: PowerShell module SqlServer not found, trying to use older SQLPS module. ImportingPowerShellModule = Importing PowerShell module {0}. diff --git a/sv-SE/SqlServerDscHelper.strings.psd1 b/sv-SE/SqlServerDscHelper.strings.psd1 index c3dd3e7c7..e192a2252 100644 --- a/sv-SE/SqlServerDscHelper.strings.psd1 +++ b/sv-SE/SqlServerDscHelper.strings.psd1 @@ -1,4 +1,4 @@ -# Swedish localized resources for helper module SqlServerDscHelper. +# Swedish localized resources for helper module SqlServerDSCHelper. ConvertFrom-StringData @' ConnectedToDatabaseEngineInstance = Ansluten till SQL instans '{0}'. diff --git a/xSQLServer.zip b/xSQLServer.zip deleted file mode 100644 index 7b08f7ccc03ced0f0c61977f0675e3aa800d4723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 404541 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 z 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%0D#$1008Fy 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 i$=~Uuwe9Z;-!^r_lY6}t$|y-c Date: Thu, 2 Nov 2017 19:15:02 -0500 Subject: [PATCH 28/42] cleanup missed renaming --- .../MSFT_SqlAG/MSFT_xSqlAG.schema.mof | 26 ------------------- .../MSFT_SqlAGDatabases.psm1 | 2 +- .../en-US/MSFT_SqlAGDatabases.strings.psd1 | 2 +- SqlServerDscHelper.psm1 | 2 +- 4 files changed, 3 insertions(+), 29 deletions(-) delete mode 100644 DSCResources/MSFT_SqlAG/MSFT_xSqlAG.schema.mof diff --git a/DSCResources/MSFT_SqlAG/MSFT_xSqlAG.schema.mof b/DSCResources/MSFT_SqlAG/MSFT_xSqlAG.schema.mof deleted file mode 100644 index 487516fd8..000000000 --- a/DSCResources/MSFT_SqlAG/MSFT_xSqlAG.schema.mof +++ /dev/null @@ -1,26 +0,0 @@ -[ClassVersion("1.0.0.0"), FriendlyName("SqlAG")] -class MSFT_SqlAG : OMI_BaseResource -{ - [Key, Description("The name of the availability group.")] String Name; - [Required, Description("Hostname of the SQL Server to be configured.")] String SQLServer; - [Key, Description("Name of the SQL instance to be configured.")] String SQLInstanceName; - [Write, Description("Specifies if the availability group should be present or absent. Default is Present."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; - [Write, Description("Specifies the automated backup preference for the availability group. Default is None"), ValueMap{"Primary","SecondaryOnly","Secondary","None"}, Values{"Primary","SecondaryOnly","Secondary","None"}] String AutomatedBackupPreference; - [Write, Description("Specifies the replica availability mode. Default is 'AsynchronousCommit'."), ValueMap{"AsynchronousCommit","SynchronousCommit"}, Values{"AsynchronousCommit","SynchronousCommit"}] String AvailabilityMode; - [Write, Description("Specifies the desired priority of the replicas in performing backups. The acceptable values for this parameter are: integers from 0 through 100. Of the set of replicas which are online and available, the replica that has the highest priority performs the backup. Default is 50.")] UInt32 BackupPriority; - [Write, Description("Specifies the type of availability group is Basic. This is only available is SQL Server 2016 and later and is ignored when applied to previous versions.")] Boolean BasicAvailabilityGroup; - [Write, Description("Specifies if the option Database Level Health Detection is enabled. This is only available is SQL Server 2016 and later and is ignored when applied to previous versions.")] Boolean DatabaseHealthTrigger; - [Write, Description("Specifies if the option Database DTC Support is enabled. This is only available is SQL Server 2016 and later and is ignored when applied to previous versions. This can't be altered once the Availability Group is created and is ignored if it is the case.")] Boolean DtcSupportEnabled; - [Write, Description("Specifies how the availability replica handles connections when in the primary role."), ValueMap{"AllowAllConnections","AllowReadWriteConnections"}, Values{"AllowAllConnections","AllowReadWriteConnections"}] String ConnectionModeInPrimaryRole; - [Write, Description("Specifies how the availability replica handles connections when in the secondary role."), ValueMap{"AllowNoConnections","AllowReadIntentConnectionsOnly","AllowAllConnections"}, Values{"AllowNoConnections","AllowReadIntentConnectionsOnly","AllowAllConnections"}] String ConnectionModeInSecondaryRole; - [Write, Description("Specifies the hostname or IP address of the availability group replica endpoint. Default is the instance network name.")] String EndpointHostName; - [Write, Description("Specifies the automatic failover behavior of the availability group."), ValueMap{"OnServerDown","OnServerUnresponsive","OnCriticalServerErrors","OnModerateServerErrors","OnAnyQualifiedFailureCondition"}, Values{"OnServerDown","OnServerUnresponsive","OnCriticalServerErrors","OnModerateServerErrors","OnAnyQualifiedFailureCondition"}] String FailureConditionLevel; - [Write, Description("Specifies the failover mode. Default is 'Manual'."), ValueMap{"Automatic","Manual"}, Values{"Automatic","Manual"}] String FailoverMode; - [Write, Description("Specifies the length of time, in milliseconds, after which AlwaysOn availability groups declare an unresponsive server to be unhealthy. Default is 30000.")] UInt32 HealthCheckTimeout; - [Write, Description("Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server Instance.")] Boolean ProcessOnlyOnActiveNode; - [Read, Description("Gets the Endpoint URL of the availability group replica endpoint.")] String EndpointUrl; - [Read, Description("Gets the port the database mirroring endpoint is listening on.")] UInt32 EndpointPort; - [Read, Description("Gets the hostname the SQL Server instance is listening on.")] String SQLServerNetName; - [Read, Description("Gets the major version of the SQL Server instance.")] UInt32 Version; - [Read, Description("Determines if the current node is actively hosting the SQL Server instance.")] Boolean IsActiveNode; -}; diff --git a/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 b/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 index 87e68014a..45b733e96 100644 --- a/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 +++ b/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 @@ -5,7 +5,7 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Pare Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` -ChildPath 'CommonResourceHelper.psm1') -$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlServerAGDatabaseMembership' +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlAGDatabases' <# .SYNOPSIS diff --git a/DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 b/DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 index 874289645..c8fd93ed7 100644 --- a/DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 +++ b/DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 @@ -1,4 +1,4 @@ -# Localized resources for SqlServerAGDatabaseMembership +# Localized resources for SqlAGDatabases ConvertFrom-StringData @' AddingDatabasesToAvailabilityGroup = Adding the following databases to the '{0}' availability group: {1}. diff --git a/SqlServerDscHelper.psm1 b/SqlServerDscHelper.psm1 index 26ca553ec..819166cf4 100644 --- a/SqlServerDscHelper.psm1 +++ b/SqlServerDscHelper.psm1 @@ -3,7 +3,7 @@ Import-Module -Name (Join-Path -Path (Join-Path -Path $PSScriptRoot ` -ChildPath 'DscResources') ` -ChildPath 'CommonResourceHelper.psm1') -$script:localizedData = Get-LocalizedData -ResourceName 'SqlServerHelper' -ScriptRoot $PSScriptRoot +$script:localizedData = Get-LocalizedData -ResourceName 'SqlServerDSCHelper' -ScriptRoot $PSScriptRoot <# .SYNOPSIS From a9c78e1a11d5af4a825c2bc361feb466aebe1378 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Tue, 7 Nov 2017 17:36:17 -0600 Subject: [PATCH 29/42] Pascal case --- Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 | 8 -------- .../MSFT_SqlDatabaseDefaultLocation.config.ps1 | 8 -------- Tests/Unit/MSFT_SqlAGListener.Tests.ps1 | 12 ------------ Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 | 2 +- .../Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 | 2 +- 5 files changed, 2 insertions(+), 30 deletions(-) diff --git a/Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 b/Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 index 0f18dfce6..77e6f90ed 100644 --- a/Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 +++ b/Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 @@ -26,11 +26,7 @@ Configuration MSFT_SqlAlwaysOnService_EnableAlwaysOn_Config ) Import-DscResource -ModuleName 'PSDscResources' -<<<<<<< HEAD:Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 Import-DscResource -ModuleName 'SqlServerDsc' -======= - Import-DscResource -ModuleName 'SqlServerDSC' ->>>>>>> first pass at complete rename:Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 node localhost { WindowsFeature 'AddFeatureFailoverClustering' @@ -155,11 +151,7 @@ Configuration MSFT_SqlAlwaysOnService_DisableAlwaysOn_Config $SqlInstallCredential ) -<<<<<<< HEAD:Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 Import-DscResource -ModuleName 'SqlServerDsc' -======= - Import-DscResource -ModuleName 'SqlServerDSC' ->>>>>>> first pass at complete rename:Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 node localhost { SqlAlwaysOnService 'Integration_Test' diff --git a/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 b/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 index 596488482..3a55bc697 100644 --- a/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 +++ b/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 @@ -68,11 +68,7 @@ Configuration MSFT_SqlDatabaseDefaultLocation_Log_Config ) Import-DscResource -ModuleName 'PSDesiredStateConfiguration' -<<<<<<< HEAD:Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 Import-DscResource -ModuleName 'SqlServerDsc' -======= - Import-DscResource -ModuleName 'SqlServerDSC' ->>>>>>> first pass at complete rename:Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 node localhost { File 'SQLLogPath' @@ -110,11 +106,7 @@ Configuration MSFT_SqlDatabaseDefaultLocation_Backup_Config ) Import-DscResource -ModuleName 'PSDesiredStateConfiguration' -<<<<<<< HEAD:Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 Import-DscResource -ModuleName 'SqlServerDsc' -======= - Import-DscResource -ModuleName 'SqlServerDSC' ->>>>>>> first pass at complete rename:Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 node localhost { File 'SQLBackupPath' diff --git a/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 b/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 index 4deb07a91..9c2ae885f 100644 --- a/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 @@ -93,11 +93,7 @@ try #endregion Pester Test Initialization -<<<<<<< HEAD:Tests/Unit/MSFT_SqlAGListener.Tests.ps1 Describe 'SqlServerAGListener\Get-TargetResource' { -======= - Describe 'SqlServerDSCAvailabilityGroupListener\Get-TargetResource' { ->>>>>>> first pass at complete rename:Tests/Unit/MSFT_SqlAGListener.Tests.ps1 BeforeEach { $testParameters = $defaultParameters.Clone() @@ -228,11 +224,7 @@ try Assert-VerifiableMock } -<<<<<<< HEAD:Tests/Unit/MSFT_SqlAGListener.Tests.ps1 Describe 'SqlServerAGListener\Test-TargetResource' { -======= - Describe 'SqlServerDSCAvailabilityGroupListener\Test-TargetResource' { ->>>>>>> first pass at complete rename:Tests/Unit/MSFT_SqlAGListener.Tests.ps1 BeforeEach { $testParameters = $defaultParameters.Clone() } @@ -517,11 +509,7 @@ try Assert-VerifiableMock } -<<<<<<< HEAD:Tests/Unit/MSFT_SqlAGListener.Tests.ps1 Describe 'SqlServerAGListener\Set-TargetResource' { -======= - Describe 'SqlServerDSCAvailabilityGroupListener\Set-TargetResource' { ->>>>>>> first pass at complete rename:Tests/Unit/MSFT_SqlAGListener.Tests.ps1 BeforeEach { $testParameters = $defaultParameters.Clone() diff --git a/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 b/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 index 164d0c49e..d441dbae5 100644 --- a/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlServerServiceAccount' #region HEADER diff --git a/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 b/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 index afbaf5be3..95768a365 100644 --- a/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDSC' +$script:DSCModuleName = 'SQLServerDsc' $script:DSCResourceName = 'MSFT_SqlWaitForAvailabilityGroup' #region HEADER From bfe47137dba1155a2b6141c483ccd82f1f9140c0 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Tue, 7 Nov 2017 17:45:55 -0600 Subject: [PATCH 30/42] Incorrect module reference; fixing Pascal case in "SQL" --- ...t.strings.psd1 => MSFT_SqlServerServiceAccount.strings.psd1} | 0 .../SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 | 2 +- .../SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 | 2 +- .../3-MatchDefinedDatabasesInAvailabilityGroup.ps1 | 2 +- .../1-ConfigureServiceAccount-UserAccount.ps1 | 2 +- .../2-ConfigureServiceAccount-VirtualAccount.ps1 | 2 +- Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 | 2 +- Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 | 2 +- 8 files changed, 7 insertions(+), 7 deletions(-) rename DSCResources/MSFT_SqlServerServiceAccount/en-US/{MSFT_xSQLServerServiceAccount.strings.psd1 => MSFT_SqlServerServiceAccount.strings.psd1} (100%) diff --git a/DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_xSQLServerServiceAccount.strings.psd1 b/DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_SqlServerServiceAccount.strings.psd1 similarity index 100% rename from DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_xSQLServerServiceAccount.strings.psd1 rename to DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_SqlServerServiceAccount.strings.psd1 diff --git a/Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 b/Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 index bb78cae9c..683d631fd 100644 --- a/Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 +++ b/Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 @@ -36,7 +36,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc Node $AllNodes.NodeName { # Adding the required service account to allow the cluster to log into SQL diff --git a/Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 b/Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 index e95c8fd6b..aebf3956e 100644 --- a/Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 +++ b/Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 @@ -31,7 +31,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc Node $AllNodes.NodeName { # Adding the required service account to allow the cluster to log into SQL diff --git a/Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 b/Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 index 2f2193fb1..794b25fd2 100644 --- a/Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 +++ b/Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 @@ -31,7 +31,7 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc Node $AllNodes.NodeName { # Adding the required service account to allow the cluster to log into SQL diff --git a/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 b/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 index 6c0e81369..72273ff5a 100644 --- a/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 +++ b/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 @@ -12,7 +12,7 @@ Configuration Example $ServiceAccountCredential ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc Node localhost { SqlServerServiceAccount SetServiceAcccount_User diff --git a/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 b/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 index 4a9918c2d..21b7227f1 100644 --- a/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 +++ b/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 @@ -15,7 +15,7 @@ Configuration Example $ServiceAcccountCredential ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDsc Node localhost { SqlServerServiceAccount SetServiceAcccount_User diff --git a/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 b/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 index d441dbae5..7a3024225 100644 --- a/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlServerServiceAccount' #region HEADER diff --git a/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 b/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 index 95768a365..7b850a125 100644 --- a/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SQLServerDsc' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlWaitForAvailabilityGroup' #region HEADER From dd2e13118b3e972f3c1385c4efd6225ea730eecf Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 9 Nov 2017 10:17:46 -0600 Subject: [PATCH 31/42] naming corrects based on reviewable comments --- DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1 | 2 +- DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 | 2 +- DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1 b/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1 index 5997d0b69..e5154e69f 100644 --- a/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1 +++ b/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# diff --git a/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 b/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 index 45b733e96..190211a82 100644 --- a/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 +++ b/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` diff --git a/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1 b/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1 index 1a4c4e17c..2117f87b2 100644 --- a/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1 +++ b/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` + -ChildPath 'SqlServerDscHelper.psm1') ` -Force <# From e0601361a593fb2aab6853fea5683ff04831ec75 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 9 Nov 2017 10:33:02 -0600 Subject: [PATCH 32/42] naming issues per PR review comments --- .../1-WaitForASingleClusterGroup.ps1 | 2 +- .../1-WaitForASingleClusterGroup.ps1 | 28 - .../2-WaitForMultipleClusterGroups.ps1 | 37 - Tests/SqlServerDscCommon.Tests.ps1 | 6 +- Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 | 4 +- .../MSFT_SqlServerServiceAccount.Tests.ps1 | 731 ------------------ Tests/Unit/MSFT_SqlWaitForAG.Tests.ps1 | 6 +- ...MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 | 244 ------ sv-SE/SqlServerDscHelper.strings.psd1 | 2 +- 9 files changed, 10 insertions(+), 1050 deletions(-) delete mode 100644 Examples/Resources/SqlWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1 delete mode 100644 Examples/Resources/SqlWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1 delete mode 100644 Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 delete mode 100644 Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 diff --git a/Examples/Resources/SqlWaitForAG/1-WaitForASingleClusterGroup.ps1 b/Examples/Resources/SqlWaitForAG/1-WaitForASingleClusterGroup.ps1 index d1566a51e..f78de9b44 100644 --- a/Examples/Resources/SqlWaitForAG/1-WaitForASingleClusterGroup.ps1 +++ b/Examples/Resources/SqlWaitForAG/1-WaitForASingleClusterGroup.ps1 @@ -16,7 +16,7 @@ Configuration Example node localhost { - SqlWaitForAG SQLConfigureAG-WaitAGTest1 + SqlWaitForAvailabilityGroup SQLConfigureAG-WaitAGTest1 { Name = 'AGTest1' RetryIntervalSec = 20 diff --git a/Examples/Resources/SqlWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1 b/Examples/Resources/SqlWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1 deleted file mode 100644 index 0624fe90c..000000000 --- a/Examples/Resources/SqlWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1 +++ /dev/null @@ -1,28 +0,0 @@ -<# - .EXAMPLE - This example will wait for the cluster role/group 'AGTest1'. -#> -Configuration Example -{ - param - ( - [Parameter(Mandatory = $true)] - [System.Management.Automation.PSCredential] - [System.Management.Automation.Credential()] - $SysAdminAccount - ) - - Import-DscResource -ModuleName SqlServerDSC - - node localhost - { - SqlWaitForAvailabilityGroup SQLConfigureAG-WaitAGTest1 - { - Name = 'AGTest1' - RetryIntervalSec = 20 - RetryCount = 30 - - PsDscRunAsCredential = $SysAdminAccount - } - } -} diff --git a/Examples/Resources/SqlWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1 b/Examples/Resources/SqlWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1 deleted file mode 100644 index 739ead20f..000000000 --- a/Examples/Resources/SqlWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1 +++ /dev/null @@ -1,37 +0,0 @@ -<# - .EXAMPLE - This example will wait for both the cluster roles/groups 'AGTest1' and 'AGTest2'. -#> -Configuration Example -{ - param - ( - [Parameter(Mandatory = $true)] - [System.Management.Automation.PSCredential] - [System.Management.Automation.Credential()] - $SysAdminAccount - ) - - Import-DscResource -ModuleName SqlServerDSC - - node localhost - { - SqlWaitForAvailabilityGroup SQLConfigureAG-WaitAGTest1 - { - Name = 'AGTest1' - RetryIntervalSec = 20 - RetryCount = 30 - - PsDscRunAsCredential = $SysAdminAccount - } - - SqlWaitForAvailabilityGroup SQLConfigureAG-WaitAGTest2 - { - Name = 'AGTest2' - RetryIntervalSec = 20 - RetryCount = 30 - - PsDscRunAsCredential = $SysAdminAccount - } - } -} diff --git a/Tests/SqlServerDscCommon.Tests.ps1 b/Tests/SqlServerDscCommon.Tests.ps1 index 366949946..43c3f6d17 100644 --- a/Tests/SqlServerDscCommon.Tests.ps1 +++ b/Tests/SqlServerDscCommon.Tests.ps1 @@ -5,7 +5,7 @@ param() $script:moduleRoot = Split-Path $PSScriptRoot -Parent -Describe 'SqlServerDSC module common tests' { +Describe 'SqlServerDsc module common tests' { Context -Name 'When there are example file for resource' { <# For Appveyor builds copy the module to the system modules directory so it falls @@ -13,7 +13,7 @@ Describe 'SqlServerDSC module common tests' { #> if ($env:APPVEYOR) { - $powershellModulePath = Join-Path -Path (($env:PSModulePath -split ';')[0]) -ChildPath 'SqlServerDSC' + $powershellModulePath = Join-Path -Path (($env:PSModulePath -split ';')[0]) -ChildPath 'SqlServerDsc' Copy-item -Path $env:APPVEYOR_BUILD_FOLDER -Destination $powershellModulePath -Recurse -Force } @@ -69,7 +69,7 @@ Describe 'SqlServerDSC module common tests' { Remove-item -Path $powershellModulePath -Recurse -Force -Confirm:$false # Restore the module in 'memory' to ensure other tests after this test have access to it - Import-Module -Name "$script:moduleRoot\SqlServerDSC.psd1" -Global -Force + Import-Module -Name "$script:moduleRoot\SqlServerDsc.psd1" -Global -Force } } } diff --git a/Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 b/Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 index 50d21d59e..fdf324e13 100644 --- a/Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 @@ -9,14 +9,14 @@ if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCR } Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force -Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent | Split-Path -Parent) -ChildPath 'SqlServerDSCHelper.psm1') -Scope Global -Force +Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent | Split-Path -Parent) -ChildPath 'SqlServerDscHelper.psm1') -Scope Global -Force Import-Module -Name ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stubs ) -ChildPath SQLPSStub.psm1 ) -Force -Global # Loading mocked classes Add-Type -Path ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stubs ) -ChildPath SMO.cs ) $TestEnvironment = Initialize-TestEnvironment ` - -DSCModuleName 'SqlServerDSC' ` + -DSCModuleName 'SqlServerDsc' ` -DSCResourceName 'MSFT_SqlAGDatabases' ` -TestType Unit diff --git a/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 b/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 deleted file mode 100644 index 7a3024225..000000000 --- a/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 +++ /dev/null @@ -1,731 +0,0 @@ -$script:DSCModuleName = 'SqlServerDsc' -$script:DSCResourceName = 'MSFT_SqlServerServiceAccount' - -#region HEADER - -# Unit Test Template Version: 1.2.1 -$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) -if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` - (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) -{ - & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests')) -} - -Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force - -$TestEnvironment = Initialize-TestEnvironment ` - -DSCModuleName $script:DSCModuleName ` - -DSCResourceName $script:DSCResourceName ` - -TestType Unit - -#endregion HEADER - -function Invoke-TestSetup -{ - # Compile the SMO stubs for use by the unit tests. - Add-Type -Path (Join-Path -Path $script:moduleRoot -ChildPath 'Tests\Unit\Stubs\SMO.cs') -} - -function Invoke-TestCleanup { - Restore-TestEnvironment -TestEnvironment $TestEnvironment -} - -# Begin Testing -try -{ - Invoke-TestSetup - - InModuleScope $script:DSCResourceName { - - $mockSqlServer = 'TestServer' - $mockDefaultInstanceName = 'MSSQLSERVER' - $mockNamedInstance = 'TestInstance' - $mockServiceType = 'DatabaseEngine' - $mockDesiredServiceAccountName = 'CONTOSO\sql.service' - $mockServiceAccountCredential = (New-Object -TypeName System.Management.Automation.PSCredential $mockDesiredServiceAccountName, (New-Object -TypeName System.Security.SecureString)) - $mockDefaultServiceAccountName = 'NT SERVICE\MSSQLSERVER' - $mockDefaultServiceAccountCredential = (New-Object -TypeName System.Management.Automation.PSCredential $mockDefaultServiceAccountName, (New-Object -TypeName System.Security.SecureString)) - $mockLocalServiceAccountName = "$($mockSqlServer)\SqlService" - $mockLocalServiceAccountCredential = (New-Object -TypeName System.Management.Automation.PSCredential $mockLocalServiceAccountName, (New-Object -TypeName System.Security.SecureString)) - - # Stores the result of SetServiceAccount calls - $testServiceAccountUpdated = @{ - Processed = $false - NewUserAccount = [System.String]::Empty - NewPassword = [System.String]::Emtpy - } - - # Script block for changing the service account in mocks - $mockSetServiceAccount = { - param - ( - [System.String] - $User, - - [System.String] - $Password - ) - - # Update the object - $testServiceAccountUpdated.Processed = $true - $testServiceAccountUpdated.NewUserAccount = $User - $testServiceAccountUpdated.NewPassword = $Password - } - - # Script block to throw an exception when changing a service account. - $mockSetServiceAccount_Exception = { - param - ( - [System.String] - $User, - - [System.String] - $Password - ) - - throw (New-Object -TypeName Microsoft.SqlServer.Management.Smo.FailedOperationException 'SetServiceAccount') - } - - # Splat for creating the SetServiceAccount method - $mockAddMemberParameters_SetServiceAccount = @{ - Name = 'SetServiceAccount' - MemberType = 'ScriptMethod' - Value = $mockSetServiceAccount - } - - $mockAddMemberParameters_SetServiceAccount_Exception = @{ - Name = 'SetServiceAccount' - MemberType = 'ScriptMethod' - Value = $mockSetServiceAccount_Exception - } - - # Used to mock ManagedComputer object for a default instance - $mockNewObject_ManagedComputer_DefaultInstance = { - $managedComputerObject = New-Object -TypeName PSObject -Property @{ - Name = $mockSqlServer - Services = @( - New-Object -TypeName PSObject -Property @{ - Name = $mockDefaultInstanceName - ServiceAccount = $mockDefaultServiceAccountName - Type = 'SqlServer' - } - ) - } - - $managedComputerObject.Services | ForEach-Object { - $_ | Add-Member @mockAddMemberParameters_SetServiceAccount - } - - return $managedComputerObject - } - - # Creates a new ManagedComputer object for a default instance with a local service account - $mockNewObject_ManagedComputer_DefaultInstance_LocalServiceAccount = { - $managedComputerObject = New-Object -TypeName PSObject -Property @{ - Name = $mockSqlServer - Services = @( - New-Object -TypeName PSObject -Property @{ - Name = $mockDefaultInstanceName - ServiceAccount = ($mockLocalServiceAccountName -replace $mockSqlServer,'.') - Type = 'SqlServer' - } - ) - } - - $managedComputerObject.Services | ForEach-Object { - $_ | Add-Member @mockAddMemberParameters_SetServiceAccount - } - - return $managedComputerObject - } - - <# - Creates a new ManagedComputer object for a default instance that thows an exception - when attempting to set the service account - #> - $mockNewObject_ManagedComputer_DefaultInstance_SetServiceAccountException = { - $managedComputerObject = New-Object -TypeName PSObject -Property @{ - Name = $mockSqlServer - Services = @( - New-Object -TypeName PSObject -Property @{ - Name = $mockDefaultInstanceName - ServiceAccount = $mockDefaultServiceAccountName - Type = 'SqlServer' - } - ) - } - - $managedComputerObject.Services | ForEach-Object { - $_ | Add-Member @mockAddMemberParameters_SetServiceAccount_Exception - } - - return $managedComputerObject - } - - # Used to mock a ManagedComputer object for a named instance - $mockNewObject_ManagedComputer_NamedInstance = { - $managedComputerObject = New-Object -TypeName PSObject -Property @{ - Name = $mockSqlServer - Services = @( - New-Object -TypeName PSObject -Property @{ - Name = ('MSSQL${0}' -f $mockNamedInstance) - ServiceAccount = $mockDesiredServiceAccountName - Type = 'SqlServer' - } - ) - } - - $managedComputerObject.Services | ForEach-Object { - $_ | Add-Member @mockAddMemberParameters_SetServiceAccount - } - - return $managedComputerObject - } - - # Used to mock a ManagedComputer object that fails to change the service account - $mockNewObject_ManagedComputer_NamedInstance_SetServiceAccountException = { - $managedComputerObject = New-Object -TypeName PSObject -Property @{ - Name = $mockSqlServer - Services = @( - New-Object -TypeName PSObject -Property @{ - Name = ('MSSQL${0}' -f $mockNamedInstance) - ServiceAccount = $mockDesiredServiceAccountName - Type = 'SqlServer' - } - ) - } - - $managedComputerObject.Services | ForEach-Object { - $_ | Add-Member @mockAddMemberParameters_SetServiceAccount_Exception - } - - return $managedComputerObject - } - - # Parameter filter for mocks of New-Object - $mockNewObject_ParameterFilter = { - $TypeName -eq 'Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer' - } - - # Splat to simplify creation of Mock for New-Object with a default instance - $mockNewObjectParameters_DefaultInstance = @{ - CommandName = 'New-Object' - MockWith = $mockNewObject_ManagedComputer_DefaultInstance - ParameterFilter = $mockNewObject_ParameterFilter - Verifiable = $true - } - - # Splat to simplify creation of Mock for New-Object with a named instance - $mockNewObjectParameters_NamedInstance = @{ - CommandName = 'New-Object' - MockWith = $mockNewObject_ManagedComputer_NamedInstance - ParameterFilter = $mockNewObject_ParameterFilter - Verifiable = $true - } - - Describe 'MSFT_SqlServerServiceAccount\ConvertTo-ManagedServiceType' -Tag 'Helper' { - Context 'Translating service types' { - $testCases = @( - @{ - ServiceType = 'DatabaseEngine' - ExpectedType = 'SqlServer' - } - - @{ - ServiceType = 'SQLServerAgent' - ExpectedType = 'SqlAgent' - } - - @{ - ServiceType = 'Search' - ExpectedType = 'Search' - } - - @{ - ServiceType = 'IntegrationServices' - ExpectedType = 'SqlServerIntegrationService' - } - - @{ - ServiceType = 'AnalysisServices' - ExpectedType = 'AnalysisServer' - } - - @{ - ServiceType = 'ReportingServices' - ExpectedType = 'ReportServer' - } - - @{ - ServiceType = 'SQLServerBrowser' - ExpectedType = 'SqlBrowser' - } - - @{ - ServiceType = 'NotificationServices' - ExpectedType = 'NotificationServer' - } - ) - - It 'Should properly map to ManagedServiceType->' -TestCases $testCases { - param - ( - [System.String] - $ServiceType, - - [System.String] - $ExpectedType - ) - - # Get the ManagedServiceType - $managedServiceType = ConvertTo-ManagedServiceType -ServiceType $ServiceType - - $managedServiceType | Should -BeOfType Microsoft.SqlServer.Management.Smo.Wmi.ManagedServiceType - $managedServiceType | Should -Be $ExpectedType - } - } - } - - Describe 'MSFT_SqlServerServiceAccount\Get-ServiceObject' -Tag 'Helper' { - Mock -CommandName Import-SQLPSModule -Verifiable - - $defaultGetServiceObjectParameters = @{ - SQLServer = $mockSqlServer - SQLInstanceName = '' - ServiceType = $mockServiceType - } - - Context 'When getting the service information for a default instance' { - Mock @mockNewObjectParameters_DefaultInstance - - It 'Should have the correct Type for the service' { - $getServiceObjectParameters = $defaultGetServiceObjectParameters.Clone() - $getServiceObjectParameters.SQLInstanceName = $mockDefaultInstanceName - - $serviceObject = Get-ServiceObject @getServiceObjectParameters - $serviceObject.Type | Should -Be 'SqlServer' - - # Ensure mocks are properly used - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 - Assert-MockCalled -CommandName New-Object -Scope It -Exactly -Times 1 - } - } - - Context 'When getting the service information for a named instance' { - Mock @mockNewObjectParameters_NamedInstance - - It 'Should have the correct Type for the service' { - $getServiceObjectParameters = $defaultGetServiceObjectParameters.Clone() - $getServiceObjectParameters.SQLInstanceName = $mockNamedInstance - - $serviceObject = Get-ServiceObject @getServiceObjectParameters - $serviceObject.Type | Should -Be 'SqlServer' - - # Ensure mocks are properly used - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 - Assert-MockCalled -CommandName New-Object -Scope It -Exactly -Times 1 - } - } - } - - Describe 'MSFT_SqlServerServiceAccount\Get-TargetResource' -Tag 'Get' { - Mock -CommandName Import-SQLPSModule -Verifiable - - Context 'When getting the service information for a default instance' { - Mock @mockNewObjectParameters_DefaultInstance - - $defaultGetTargetResourceParameters = @{ - SQLServer = $mockSqlServer - SQLInstanceName = $mockDefaultInstanceName - ServiceType = $mockServiceType - ServiceAccount = $mockDefaultServiceAccountCredential - } - - It 'Should return the correct service information' { - # Get the service information - $testServiceInformation = Get-TargetResource @defaultGetTargetResourceParameters - - # Validate the hashtable returned - $testServiceInformation.SQLServer | Should -Be $mockSqlServer - $testServiceInformation.SQLInstanceName | Should -Be $mockDefaultInstanceName - $testServiceInformation.ServiceType | Should -Be 'SqlServer' - $testServiceInformation.ServiceAccount | Should -Be $mockDefaultServiceAccountName - - # Ensure mocks were properly used - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 - } - - It 'Should throw the correct exception when an invalid ServiceType and InstanceName are specified' { - $getTargetResourceParameters = $defaultGetTargetResourceParameters.Clone() - $getTargetResourceParameters.ServiceType = 'SQLServerAgent' - - { Get-TargetResource @getTargetResourceParameters } | - Should -Throw "The SQLServerAgent service on $($mockSqlServer)\$($mockDefaultInstanceName) could not be found." - - # Ensure mocks were properly used - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 - } - } - - Context 'When getting the service information for a named instance' { - Mock @mockNewObjectParameters_NamedInstance - - # Splat the function parameters - $defaultGetTargetResourceParameters = @{ - SQLServer = $mockSqlServer - SQLInstanceName = $mockNamedInstance - ServiceType = $mockServiceType - ServiceAccount = $mockServiceAccountCredential - } - - It 'Should return the correct service information' { - # Get the service information - $testServiceInformation = Get-TargetResource @defaultGetTargetResourceParameters - - # Validate the hashtable returned - $testServiceInformation.SQLServer | Should -Be $mockSqlServer - $testServiceInformation.SQLInstanceName | Should -Be $mockNamedInstance - $testServiceInformation.ServiceType | Should -Be 'SqlServer' - $testServiceInformation.ServiceAccount | Should -Be $mockDesiredServiceAccountName - - # Ensure mocks were properly used - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 - } - - It 'Should throw the correct exception when an invalid ServiceType and InstanceName are specified' { - $getTargetResourceParameters = $defaultGetTargetResourceParameters.Clone() - $getTargetResourceParameters.ServiceType = 'SQLServerAgent' - - { Get-TargetResource @getTargetResourceParameters } | - Should -Throw "The SQLServerAgent service on $($mockSqlServer)\$($mockNamedInstance) could not be found." - - # Ensure mocks were properly used - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 - } - } - - Context 'When the service account is local to the machine' { - $mockNewObjectParameters = $mockNewObjectParameters_DefaultInstance.Clone() - $mockNewObjectParameters.MockWith = $mockNewObject_ManagedComputer_DefaultInstance_LocalServiceAccount - - Mock @mockNewObjectParameters - - $defaultGetTargetResourceParameters = @{ - SQLServer = $mockSqlServer - SQLInstanceName = $mockDefaultInstanceName - ServiceType = $mockServiceType - ServiceAccount = $mockLocalServiceAccountCredential - } - - It 'Should have the same domain name as the computer name' { - $currentState = Get-TargetResource @defaultGetTargetResourceParameters - - # Validate the service account - $currentState.ServiceAccount | Should -Be $mockLocalServiceAccountName - - # Ensure mocks were properly used - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 - } - } - } - - Describe 'MSFT_SqlServerServiceAccount\Test-TargetResource' -Tag 'Test' { - Mock -CommandName Import-SQLPSModule -Verifiable - - Context 'When the system is not in the desired state for a default instance' { - Mock @mockNewObjectParameters_DefaultInstance - - It 'Should return false' { - $testTargetResourceParameters = @{ - SQLServer = $mockSqlServer - SQLInstanceName = $mockDefaultInstanceName - ServiceType = $mockServiceType - ServiceAccount = $mockServiceAccountCredential - } - - Test-TargetResource @testTargetResourceParameters | Should -Be $false - - # Ensure mocks are properly used - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 - } - } - - Context 'When the system is in the desired state or a default instance' { - Mock @mockNewObjectParameters_DefaultInstance - - It 'Should return true' { - $testTargetResourceParameters = @{ - SQLServer = $mockSqlServer - SQLInstanceName = $mockDefaultInstanceName - ServiceType = $mockServiceType - ServiceAccount = $mockDefaultServiceAccountCredential - } - - Test-TargetResource @testTargetResourceParameters | Should -Be $true - - # Ensure mocks are properly used - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 - } - } - - Context 'When the system is in the desired state and Force is specified' { - Mock @mockNewObjectParameters_DefaultInstance - - It 'Should return False when Force is specified' { - $testTargetResourceParameters = @{ - SQLServer = $mockSqlServer - SQLInstanceName = $mockDefaultInstanceName - ServiceType = $mockServiceType - ServiceAccount = $mockServiceAccountCredential - Force = $true - } - - Test-TargetResource @testTargetResourceParameters | Should -Be $false - - # Ensure mocks are properly used - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 0 - } - } - - Context 'When the system is not in the desired state for a named instance' { - Mock @mockNewObjectParameters_NamedInstance - - It 'Should return false' { - $testTargetResourceParameters = @{ - SQLServer = $mockSqlServer - SQLInstanceName = $mockNamedInstance - ServiceType = $mockServiceType - ServiceAccount = $mockDefaultServiceAccountCredential - } - - Test-TargetResource @testTargetResourceParameters | Should -Be $false - - # Ensure mocks are properly used - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 - } - } - - Context 'When the system is in the desired state for a named instance' { - Mock @mockNewObjectParameters_NamedInstance - - It 'Should return true' { - $testTargetResourceParameters = @{ - SQLServer = $mockSqlServer - SQLInstanceName = $mockNamedInstance - ServiceType = $mockServiceType - ServiceAccount = $mockServiceAccountCredential - } - - Test-TargetResource @testTargetResourceParameters | Should -Be $true - - # Ensure mocks are properly used - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Exactly -Times 1 - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 - } - } - - Context 'When the system is in the desired state for a named instance and Force is specified' { - Mock @mockNewObjectParameters_NamedInstance - - It 'Should return false' { - $testTargetResourceParameters = @{ - SQLServer = $mockSqlServer - SQLInstanceName = $mockNamedInstance - ServiceType = $mockServiceType - ServiceAccount = $mockServiceAccountCredential - Force = $true - } - - # Validate the return value - Test-TargetResource @testTargetResourceParameters | Should -Be $false - - # Ensure mocks are properly used - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 0 - } - } - } - - Describe 'MSFT_SqlServerServiceAccount\Set-TargetResource' -Tag 'Set' { - Mock -CommandName Import-SQLPSModule -Verifiable - - Context 'When changing the service account for the default instance' { - BeforeAll { - $defaultSetTargetResourceParameters = @{ - SQLServer = $mockSqlServer - SQLInstanceName = $mockDefaultInstanceName - ServiceType = $mockServiceType - ServiceAccount = $mockDefaultServiceAccountCredential - } - - Mock @mockNewObjectParameters_DefaultInstance - - Mock -CommandName Restart-SqlService -Verifiable - } - - BeforeEach { - $testServiceAccountUpdated.Processed = $false - $testServiceAccountUpdated.NewUserAccount = [System.String]::Empty - $testServiceAccountUpdated.NewPassword = [System.String]::Empty - } - - It 'Should update the service account information' { - $setTargetResourceParameters = $defaultSetTargetResourceParameters.Clone() - - # Update the service information - Set-TargetResource @setTargetResourceParameters - - # Validate that the correct information was passed through and updated - $testServiceAccountUpdated.Processed | Should -Be $true - $testServiceAccountUpdated.NewUserAccount | Should -Be $setTargetResourceParameters.ServiceAccount.Username - $testServiceAccountUpdated.NewPassword | Should -Be $setTargetResourceParameters.ServiceAccount.GetNetworkCredential().Password - - # Ensure mocks are used properly - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 - Assert-MockCalled -CommandName Restart-SqlService -Scope It -Exactly -Times 0 - } - - It 'Should throw the correct exception when an invalid service name and type is provided' { - $setTargetResourceParameters = $defaultSetTargetResourceParameters.Clone() - $setTargetResourceParameters.ServiceType = 'SQLServerAgent' - - # Get the localized error message - $mockCorrectErrorMessage = $script:localizedData.ServiceNotFound -f $setTargetResourceParameters.ServiceType, $setTargetResourceParameters.SQLServer, $setTargetResourceParameters.SQLInstanceName - - # Attempt to update the service account - { Set-TargetResource @setTargetResourceParameters } | Should -Throw $mockCorrectErrorMessage - - # Ensure mocks are used properly - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 - Assert-MockCalled -CommandName Restart-SqlService -Scope It -Exactly -Times 0 - } - - It 'Should restart the service if requested' { - $setTargetResourceParameters = $defaultSetTargetResourceParameters.Clone() - $setTargetResourceParameters += @{ - RestartService = $true - } - - Set-TargetResource @setTargetResourceParameters - - # Ensure mocks are used properly - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 - Assert-MockCalled -CommandName Restart-SqlService -Scope It -Exactly -Times 1 - } - - It 'Should throw the correct exception if SetServiceAccount call fails' { - $newObjectParms = $mockNewObjectParameters_DefaultInstance.Clone() - $newObjectParms.MockWith = $mockNewObject_ManagedComputer_DefaultInstance_SetServiceAccountException - - Mock @newObjectParms - - $setTargetResourceParameters = $defaultSetTargetResourceParameters.Clone() - - # Get the localized error message - $mockCorrectErrorMessage = $script:localizedData.SetServiceAccountFailed -f $setTargetResourceParameters.SQLServer, $setTargetResourceParameters.SQLInstanceName, '' - - # Attempt to update the service account - { Set-TargetResource @setTargetResourceParameters } | Should -Throw $mockCorrectErrorMessage - - # Ensure mocks are used properly - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 - Assert-MockCalled -CommandName Restart-SqlService -Scope It -Exactly -Times 0 - } - } - - Context 'When changing the service account for the default instance' { - BeforeAll { - $defaultSetTargetResourceParameters = @{ - SQLServer = $mockSqlServer - SQLInstanceName = $mockNamedInstance - ServiceType = $mockServiceType - ServiceAccount = $mockDefaultServiceAccountCredential - } - - Mock @mockNewObjectParameters_NamedInstance - - Mock -CommandName Restart-SqlService -Verifiable - } - - BeforeEach { - $testServiceAccountUpdated.Processed = $false - $testServiceAccountUpdated.NewUserAccount = [System.String]::Empty - $testServiceAccountUpdated.NewPassword = [System.String]::Empty - } - - It 'Should update the service account information' { - $setTargetResourceParameters = $defaultSetTargetResourceParameters.Clone() - - # Update the service information - Set-TargetResource @setTargetResourceParameters - - # Validate that the correct information was passed through and updated - $testServiceAccountUpdated.Processed | Should -Be $true - $testServiceAccountUpdated.NewUserAccount | Should -Be $setTargetResourceParameters.ServiceAccount.Username - $testServiceAccountUpdated.NewPassword | Should -Be $setTargetResourceParameters.ServiceAccount.GetNetworkCredential().Password - - # Ensure mocks are used properly - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 - Assert-MockCalled -CommandName Restart-SqlService -Scope It -Exactly -Times 0 - } - - It 'Should throw the correct exception when an invalid service name and type is provided' { - $setTargetResourceParameters = $defaultSetTargetResourceParameters.Clone() - $setTargetResourceParameters.ServiceType = 'SQLServerAgent' - - # Get the expected localized error message - $mockCorrectErrorMessage = $script:localizedData.ServiceNotFound -f $setTargetResourceParameters.ServiceType, $setTargetResourceParameters.SQLServer, $setTargetResourceParameters.SQLInstanceName - - # Attempt to update the service account - { Set-TargetResource @setTargetResourceParameters } | Should -Throw $mockCorrectErrorMessage - - # Ensure mocks are used properly - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 - Assert-MockCalled -CommandName Restart-SqlService -Scope It -Exactly -Times 0 - } - - It 'Should restart the service if requested' { - $setTargetResourceParameters = $defaultSetTargetResourceParameters.Clone() - $setTargetResourceParameters += @{ - RestartService = $true - } - - Set-TargetResource @setTargetResourceParameters - - # Ensure mocks are used properly - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 - Assert-MockCalled -CommandName Restart-SqlService -Scope It -Exactly -Times 1 - } - - It 'Should throw the correct exception if SetServiceAccount call fails' { - $newObjectParms = $mockNewObjectParameters_NamedInstance.Clone() - $newObjectParms.MockWith = $mockNewObject_ManagedComputer_NamedInstance_SetServiceAccountException - - Mock @newObjectParms - - $setTargetResourceParameters = $defaultSetTargetResourceParameters.Clone() - - # Get the expected localized error message - $mockCorrectErrorMessage = $script:localizedData.SetServiceAccountFailed -f $setTargetResourceParameters.SQLServer, $setTargetResourceParameters.SQLInstanceName, '' - - # Attempt to update the service information - { Set-TargetResource @setTargetResourceParameters } | Should -Throw $mockCorrectErrorMessage - - # Ensure mocks are used properly - Assert-MockCalled -CommandName New-Object -ParameterFilter $mockNewObject_ParameterFilter -Scope It -Exactly -Times 1 - Assert-MockCalled -CommandName Restart-SqlService -Scope It -Exactly -Times 0 - } - } - } - } -} -finally -{ - Invoke-TestCleanup -} diff --git a/Tests/Unit/MSFT_SqlWaitForAG.Tests.ps1 b/Tests/Unit/MSFT_SqlWaitForAG.Tests.ps1 index 226dd6a65..8b21a4e3c 100644 --- a/Tests/Unit/MSFT_SqlWaitForAG.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlWaitForAG.Tests.ps1 @@ -78,7 +78,7 @@ try RetryCount = $mockRetryCount } - Describe 'MSFT_SqlWaitForAG\Get-TargetResource' -Tag 'Get' { + Describe 'MSFT_SqlWaitForAvailabilityGroup\Get-TargetResource' -Tag 'Get' { BeforeEach { $testParameters = $mockDefaultParameters.Clone() @@ -142,7 +142,7 @@ try } - Describe 'MSFT_SqlWaitForAG\Test-TargetResource' -Tag 'Test'{ + Describe 'MSFT_SqlWaitForAvailabilityGroup\Test-TargetResource' -Tag 'Test'{ BeforeEach { $testParameters = $mockDefaultParameters.Clone() @@ -191,7 +191,7 @@ try Assert-VerifiableMock } - Describe 'MSFT_SqlWaitForAG\Set-TargetResource' -Tag 'Set'{ + Describe 'MSFT_SqlWaitForAvailabilityGroup\Set-TargetResource' -Tag 'Set'{ BeforeEach { $testParameters = $mockDefaultParameters.Clone() diff --git a/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 b/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 deleted file mode 100644 index 7b850a125..000000000 --- a/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 +++ /dev/null @@ -1,244 +0,0 @@ -$script:DSCModuleName = 'SqlServerDsc' -$script:DSCResourceName = 'MSFT_SqlWaitForAvailabilityGroup' - -#region HEADER - -# Unit Test Template Version: 1.2.0 -$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) -if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` - (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) -{ - & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) -} - -Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force - -$TestEnvironment = Initialize-TestEnvironment ` - -DSCModuleName $script:DSCModuleName ` - -DSCResourceName $script:DSCResourceName ` - -TestType Unit - -#endregion HEADER - -function Invoke-TestSetup { -} - -function Invoke-TestCleanup { - Restore-TestEnvironment -TestEnvironment $TestEnvironment -} - -# Begin Testing -try -{ - Invoke-TestSetup - - InModuleScope $script:DSCResourceName { - $mockClusterGroupName = 'AGTest' - $mockRetryInterval = 1 - $mockRetryCount = 2 - - $mockOtherClusterGroupName = 'UnknownAG' - - # Function stub of Get-ClusterGroup (when we do not have Failover Cluster powershell module available) - function Get-ClusterGroup { - param - ( - # Will contain the cluster group name so mock can bind filters on it. - [Parameter()] - [System.String] - $Name - ) - - throw '{0}: StubNotImplemented' -f $MyInvocation.MyCommand - } - - $mockGetClusterGroup = { - if ($Name -ne $mockExpectedClusterGroupName) - { - throw ('Mock Get-ClusterGroup called with unexpected name. Expected ''{0}'', but was ''{1}''' -f $mockExpectedClusterGroupName, $Name) - } - - return New-Object -TypeName PSObject -Property @{ - Name = $Name - } - } - - $mockGetClusterGroup_ParameterFilter_KnownGroup = { - $Name -eq $mockClusterGroupName - } - - $mockGetClusterGroup_ParameterFilter_UnknownGroup = { - $Name -eq $mockOtherClusterGroupName - } - - # Default parameters that are used for the It-blocks - $mockDefaultParameters = @{ - Name = $mockClusterGroupName - RetryIntervalSec = $mockRetryInterval - RetryCount = $mockRetryCount - } - - Describe 'MSFT_SqlWaitForAvailabilityGroup\Get-TargetResource' -Tag 'Get' { - BeforeEach { - $testParameters = $mockDefaultParameters.Clone() - - Mock -CommandName Get-ClusterGroup -MockWith $mockGetClusterGroup -ParameterFilter $mockGetClusterGroup_ParameterFilter_KnownGroup -Verifiable - Mock -CommandName Get-ClusterGroup -MockWith { - return $null - } -ParameterFilter $mockGetClusterGroup_ParameterFilter_UnknownGroup -Verifiable - } - - Context 'When the system is in the desired state' { - $mockExpectedClusterGroupName = $mockClusterGroupName - - It 'Should return the same values as passed as parameters' { - $result = Get-TargetResource @testParameters - $result.RetryIntervalSec | Should -Be $mockRetryInterval - $result.RetryCount | Should -Be $mockRetryCount - - Assert-MockCalled -CommandName Get-ClusterGroup ` - -ParameterFilter $mockGetClusterGroup_ParameterFilter_KnownGroup ` - -Exactly -Times 1 -Scope It - - Assert-MockCalled -CommandName Get-ClusterGroup ` - -ParameterFilter $mockGetClusterGroup_ParameterFilter_UnknownGroup ` - -Exactly -Times 0 -Scope It - } - - It 'Should return that the group exist' { - $result = Get-TargetResource @testParameters - $result.GroupExist | Should -Be $true - } - } - - Context 'When the system is not in the desired state' { - BeforeEach { - $testParameters.Name = $mockOtherClusterGroupName - } - - $mockExpectedClusterGroupName = $mockOtherClusterGroupName - - It 'Should return the same values as passed as parameters' { - $result = Get-TargetResource @testParameters - $result.RetryIntervalSec | Should -Be $mockRetryInterval - $result.RetryCount | Should -Be $mockRetryCount - - Assert-MockCalled -CommandName Get-ClusterGroup ` - -ParameterFilter $mockGetClusterGroup_ParameterFilter_KnownGroup ` - -Exactly -Times 0 -Scope It - - Assert-MockCalled -CommandName Get-ClusterGroup ` - -ParameterFilter $mockGetClusterGroup_ParameterFilter_UnknownGroup ` - -Exactly -Times 1 -Scope It - } - - It 'Should return that the group does not exist' { - $result = Get-TargetResource @testParameters - $result.GroupExist | Should -Be $false - } - } - - Assert-VerifiableMock - } - - - Describe 'MSFT_SqlWaitForAvailabilityGroup\Test-TargetResource' -Tag 'Test'{ - BeforeEach { - $testParameters = $mockDefaultParameters.Clone() - - Mock -CommandName Get-ClusterGroup -MockWith $mockGetClusterGroup -ParameterFilter $mockGetClusterGroup_ParameterFilter_KnownGroup -Verifiable - Mock -CommandName Get-ClusterGroup -MockWith { - return $null - } -ParameterFilter $mockGetClusterGroup_ParameterFilter_UnknownGroup -Verifiable - } - - Context 'When the system is in the desired state' { - $mockExpectedClusterGroupName = $mockClusterGroupName - - It 'Should return that desired state is present ($true)' { - $result = Test-TargetResource @testParameters - $result | Should -Be $true - - Assert-MockCalled -CommandName Get-ClusterGroup ` - -ParameterFilter $mockGetClusterGroup_ParameterFilter_KnownGroup ` - -Exactly -Times 1 -Scope It - - Assert-MockCalled -CommandName Get-ClusterGroup ` - -ParameterFilter $mockGetClusterGroup_ParameterFilter_UnknownGroup ` - -Exactly -Times 0 -Scope It - } - } - - Context 'When the system is not in the desired state' { - $mockExpectedClusterGroupName = $mockOtherClusterGroupName - - It 'Should return that desired state is absent ($false)' { - $testParameters.Name = $mockOtherClusterGroupName - - $result = Test-TargetResource @testParameters - $result | Should -Be $false - - Assert-MockCalled -CommandName Get-ClusterGroup ` - -ParameterFilter $mockGetClusterGroup_ParameterFilter_KnownGroup ` - -Exactly -Times 0 -Scope It - - Assert-MockCalled -CommandName Get-ClusterGroup ` - -ParameterFilter $mockGetClusterGroup_ParameterFilter_UnknownGroup ` - -Exactly -Times 1 -Scope It - } - } - - Assert-VerifiableMock - } - - Describe 'MSFT_SqlWaitForAvailabilityGroup\Set-TargetResource' -Tag 'Set'{ - BeforeEach { - $testParameters = $mockDefaultParameters.Clone() - - Mock -CommandName Start-Sleep - Mock -CommandName Get-ClusterGroup -MockWith $mockGetClusterGroup -ParameterFilter $mockGetClusterGroup_ParameterFilter_KnownGroup -Verifiable - Mock -CommandName Get-ClusterGroup -MockWith { - return $null - } -ParameterFilter $mockGetClusterGroup_ParameterFilter_UnknownGroup -Verifiable - } - - Context 'When the system is in the desired state' { - $mockExpectedClusterGroupName = $mockClusterGroupName - - It 'Should find the cluster group and return without throwing' { - { Set-TargetResource @testParameters } | Should -Not -Throw - - Assert-MockCalled -CommandName Get-ClusterGroup ` - -ParameterFilter $mockGetClusterGroup_ParameterFilter_KnownGroup ` - -Exactly -Times 1 -Scope It - - Assert-MockCalled -CommandName Get-ClusterGroup ` - -ParameterFilter $mockGetClusterGroup_ParameterFilter_UnknownGroup ` - -Exactly -Times 0 -Scope It } - } - - Context 'When the system is not in the desired state' { - $mockExpectedClusterGroupName = $mockOtherClusterGroupName - - It 'Should throw the correct error message' { - $testParameters.Name = $mockOtherClusterGroupName - - { Set-TargetResource @testParameters } | Should -Throw 'Cluster group UnknownAG not found after 2 attempts with 1 sec interval' - - Assert-MockCalled -CommandName Get-ClusterGroup ` - -ParameterFilter $mockGetClusterGroup_ParameterFilter_KnownGroup ` - -Exactly -Times 0 -Scope It - - Assert-MockCalled -CommandName Get-ClusterGroup ` - -ParameterFilter $mockGetClusterGroup_ParameterFilter_UnknownGroup ` - -Exactly -Times 2 -Scope It } - } - - Assert-VerifiableMock - } - } -} -finally -{ - Invoke-TestCleanup -} diff --git a/sv-SE/SqlServerDscHelper.strings.psd1 b/sv-SE/SqlServerDscHelper.strings.psd1 index e192a2252..c3dd3e7c7 100644 --- a/sv-SE/SqlServerDscHelper.strings.psd1 +++ b/sv-SE/SqlServerDscHelper.strings.psd1 @@ -1,4 +1,4 @@ -# Swedish localized resources for helper module SqlServerDSCHelper. +# Swedish localized resources for helper module SqlServerDscHelper. ConvertFrom-StringData @' ConnectedToDatabaseEngineInstance = Ansluten till SQL instans '{0}'. From 3a61e7fcf278f7052189057850a783557b281715 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 9 Nov 2017 10:55:47 -0600 Subject: [PATCH 33/42] many naming fixes from PR comments --- CHANGELOG.md | 2 +- .../MSFT_SqlServerMaxDop.psm1 | 295 ++++++++++++++ .../MSFT_SqlServerServiceAccount.psm1 | 367 ------------------ .../MSFT_SqlServerServiceAccount.schema.mof | 10 - .../MSFT_SqlServerServiceAccount.strings.psd1 | 11 - .../MSFT_SqlWaitForAG.schema.mof | 2 +- .../MSFT_SqlWaitForAvailabilityGroup.psm1 | 175 --------- ...SFT_SqlWaitForAvailabilityGroup.schema.mof | 8 - .../1-ConfigureServiceAccount-UserAccount.ps1 | 27 -- ...ConfigureServiceAccount-VirtualAccount.ps1 | 31 -- .../1-ConfigureServiceAccount-UserAccount.ps1 | 2 +- ...ConfigureServiceAccount-VirtualAccount.ps1 | 2 +- SQLServerDsc.psd1 | 2 +- SqlServerDscHelper.psm1 | 2 +- en-US/SqlServerDscHelper.strings.psd1 | 2 +- 15 files changed, 302 insertions(+), 636 deletions(-) delete mode 100644 DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.psm1 delete mode 100644 DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.schema.mof delete mode 100644 DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_SqlServerServiceAccount.strings.psd1 delete mode 100644 DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.psm1 delete mode 100644 DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.schema.mof delete mode 100644 Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 delete mode 100644 Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b635d7c0..56269e0e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ - Significant rename to reduce length of Resource names - BREAKING CHANGE - Impact to all resources -- Changes to xSQLServer +- Changes to SqlServerDsc - Updated Pester syntax to v4 - Fixes broken links to issues in the CHANGELOG.md. - Changes to SqlDatabase diff --git a/DSCResources/MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.psm1 b/DSCResources/MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.psm1 index e43239203..d69dbb3ee 100644 --- a/DSCResources/MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.psm1 +++ b/DSCResources/MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.psm1 @@ -323,3 +323,298 @@ function Get-SqlDscDynamicMaxDop } Export-ModuleMember -Function *-TargetResource +Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` + -ChildPath 'SqlServerDscHelper.psm1') ` + -Force +<# + .SYNOPSIS + This function gets the max degree of parallelism server configuration option. + + .PARAMETER SQLServer + The host name of the SQL Server to be configured. + + .PARAMETER SQLInstanceName + The name of the SQL instance to be configured. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $SQLInstanceName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $SQLServer = $env:COMPUTERNAME + ) + + $sqlServerObject = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName + + if ($sqlServerObject) + { + Write-Verbose -Message 'Getting the max degree of parallelism server configuration option' + $currentMaxDop = $sqlServerObject.Configuration.MaxDegreeOfParallelism.ConfigValue + } + + $returnValue = @{ + SQLInstanceName = $SQLInstanceName + SQLServer = $SQLServer + MaxDop = $currentMaxDop + } + + $returnValue +} + +<# + .SYNOPSIS + This function sets the max degree of parallelism server configuration option. + + .PARAMETER SQLServer + The host name of the SQL Server to be configured. + + .PARAMETER SQLInstanceName + The name of the SQL instance to be configured. + + .PARAMETER Ensure + When set to 'Present' then max degree of parallelism will be set to either the value in parameter MaxDop or dynamically configured when parameter DynamicAlloc is set to $true. + When set to 'Absent' max degree of parallelism will be set to 0 which means no limit in number of processors used in parallel plan execution. + + .PARAMETER DynamicAlloc + If set to $true then max degree of parallelism will be dynamically configured. + When this is set parameter is set to $true, the parameter MaxDop must be set to $null or not be configured. + + .PARAMETER MaxDop + A numeric value to limit the number of processors used in parallel plan execution. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $SQLInstanceName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $SQLServer = $env:COMPUTERNAME, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [ValidateNotNullOrEmpty()] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.Boolean] + $DynamicAlloc, + + [Parameter()] + [System.Int32] + $MaxDop + ) + + $sqlServerObject = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName + + if ($sqlServerObject) + { + Write-Verbose -Message 'Setting the max degree of parallelism server configuration option' + switch ($Ensure) + { + 'Present' + { + if ($DynamicAlloc) + { + if ($MaxDop) + { + throw New-TerminatingError -ErrorType MaxDopParamMustBeNull ` + -FormatArgs @( $SQLServer, $SQLInstanceName ) ` + -ErrorCategory InvalidArgument + } + + $targetMaxDop = Get-SqlDscDynamicMaxDop -SqlServerObject $sqlServerObject + New-VerboseMessage -Message "Dynamic MaxDop is $targetMaxDop." + } + else + { + $targetMaxDop = $MaxDop + } + } + + 'Absent' + { + $targetMaxDop = 0 + New-VerboseMessage -Message 'Desired state should be absent - MAXDOP is reset to the default value.' + } + } + + try + { + $sqlServerObject.Configuration.MaxDegreeOfParallelism.ConfigValue = $targetMaxDop + $sqlServerObject.Alter() + New-VerboseMessage -Message "Setting MAXDOP value to $targetMaxDop." + } + catch + { + throw New-TerminatingError -ErrorType MaxDopSetError ` + -FormatArgs @($SQLServer, $SQLInstanceName, $targetMaxDop) ` + -ErrorCategory InvalidOperation ` + -InnerException $_.Exception + } + } +} + +<# + .SYNOPSIS + This function tests the max degree of parallelism server configuration option. + + .PARAMETER SQLServer + The host name of the SQL Server to be configured. + + .PARAMETER SQLInstanceName + The name of the SQL instance to be configured. + + .PARAMETER Ensure + When set to 'Present' then max degree of parallelism will be set to either the value in parameter MaxDop or dynamically configured when parameter DynamicAlloc is set to $true. + When set to 'Absent' max degree of parallelism will be set to 0 which means no limit in number of processors used in parallel plan execution. + + .PARAMETER DynamicAlloc + If set to $true then max degree of parallelism will be dynamically configured. + When this is set parameter is set to $true, the parameter MaxDop must be set to $null or not be configured. + + .PARAMETER MaxDop + A numeric value to limit the number of processors used in parallel plan execution. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $SQLInstanceName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $SQLServer = $env:COMPUTERNAME, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [ValidateNotNullOrEmpty()] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.Boolean] + $DynamicAlloc, + + [Parameter()] + [System.Int32] + $MaxDop + ) + + Write-Verbose -Message 'Testing the max degree of parallelism server configuration option' + + $parameters = @{ + SQLInstanceName = $SQLInstanceName + SQLServer = $SQLServer + } + + $currentValues = Get-TargetResource @parameters + $getMaxDop = $currentValues.MaxDop + $isMaxDopInDesiredState = $true + + switch ($Ensure) + { + 'Absent' + { + if ($getMaxDop -ne 0) + { + New-VerboseMessage -Message "Current MaxDop is $getMaxDop should be updated to 0" + $isMaxDopInDesiredState = $false + } + } + 'Present' + { + if ($DynamicAlloc) + { + if ($MaxDop) + { + throw New-TerminatingError -ErrorType MaxDopParamMustBeNull ` + -FormatArgs @( $SQLServer, $SQLInstanceName ) ` + -ErrorCategory InvalidArgument + } + + $dynamicMaxDop = Get-SqlDscDynamicMaxDop + New-VerboseMessage -Message "Dynamic MaxDop is $dynamicMaxDop." + + if ($getMaxDop -ne $dynamicMaxDop) + { + New-VerboseMessage -Message "Current MaxDop is $getMaxDop should be updated to $dynamicMaxDop" + $isMaxDopInDesiredState = $false + } + } + else + { + if ($getMaxDop -ne $MaxDop) + { + New-VerboseMessage -Message "Current MaxDop is $getMaxDop should be updated to $MaxDop" + $isMaxDopInDesiredState = $false + } + } + } + } + + $isMaxDopInDesiredState +} + +<# + .SYNOPSIS + This cmdlet is used to return the dynamic max degree of parallelism +#> +function Get-SqlDscDynamicMaxDop +{ + $cimInstanceProc = Get-CimInstance -ClassName Win32_Processor + + # init variables + $numProcs = 0 + $numCores = 0 + + # Loop through returned objects + foreach ($processor in $cimInstanceProc) + { + # increment number of processors + $numProcs += $processor.NumberOfLogicalProcessors + + # increment number of cores + $numCores += $processor.NumberOfCores + } + + + if ($numProcs -eq 1) + { + $dynamicMaxDop = [Math]::Round($numCores / 2, [System.MidpointRounding]::AwayFromZero) + } + elseif ($numCores -ge 8) + { + $dynamicMaxDop = 8 + } + else + { + $dynamicMaxDop = $numCores + } + + $dynamicMaxDop +} + +Export-ModuleMember -Function *-TargetResource diff --git a/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.psm1 b/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.psm1 deleted file mode 100644 index 76b247cc3..000000000 --- a/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.psm1 +++ /dev/null @@ -1,367 +0,0 @@ -Import-Module -Name (Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') - -Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` - -ChildPath 'CommonResourceHelper.psm1') - -$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlServerServiceAccount' - -<# - .SYNOPSIS - Gets the service account for the specified instance. - - .PARAMETER SQLServer - Host name of the SQL Server to manage. - - .PARAMETER SQLInstanceName - Name of the SQL instance. - - .PARAMETER ServiceType - Type of service to be managed. Must be one of the following: - DatabaseEngine, SQLServerAgent, Search, IntegrationServices, AnalysisServices, ReportingServices, SQLServerBrowser, NotificationServices. - - .PARAMETER ServiceAccount - ** Not used in this function ** - Credential of the service account that should be used. - - .EXAMPLE - Get-TargetResource -SQLServer $env:COMPUTERNAME -SQLInstanceName MSSQLSERVER -ServiceType SqlServer -ServiceAccount $account -#> -function Get-TargetResource -{ - [CmdletBinding()] - [OutputType([System.Collections.Hashtable])] - param - ( - [Parameter(Mandatory = $true)] - [System.String] - $SQLServer, - - [Parameter(Mandatory = $true)] - [System.String] - $SQLInstanceName, - - [Parameter(Mandatory = $true)] - [ValidateSet('DatabaseEngine', 'SQLServerAgent', 'Search', 'IntegrationServices', 'AnalysisServices', 'ReportingServices', 'SQLServerBrowser', 'NotificationServices')] - [System.String] - $ServiceType, - - [Parameter(Mandatory = $true)] - [System.Management.Automation.PSCredential] - $ServiceAccount - ) - - # Get the SMO Service object instance - $serviceObject = Get-ServiceObject -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName -ServiceType $ServiceType - - # If no service was found, throw an exception - if (-not $serviceObject) - { - $errorMessage = $script:localizedData.ServiceNotFound -f $ServiceType, $SQLServer, $SQLInstanceName - New-ObjectNotFoundException -Message $errorMessage - } - - # Local accounts will start with a '.' - # Replace a domain of '.' with the value for $SQLServer - $serviceAccountName = $serviceObject.ServiceAccount -ireplace '^([\.])\\(.*)$', "$SQLServer\`$2" - - # Return a hashtable with the service information - return @{ - SQLServer = $SQLServer - SQLInstanceName = $SQLInstanceName - ServiceType = $serviceObject.Type - ServiceAccount = $serviceAccountName - } -} - -<# - .SYNOPSIS - Tests whether the specified instance's service account is correctly configured. - - .PARAMETER SQLServer - Host name of the SQL Server to manage. - - .PARAMETER SQLInstanceName - Name of the SQL instance. - - .PARAMETER ServiceType - Type of service to be managed. Must be one of the following: - DatabaseEngine, SQLServerAgent, Search, IntegrationServices, AnalysisServices, ReportingServices, SQLServerBrowser, NotificationServices. - - .PARAMETER ServiceAccount - Credential of the service account that should be used. - - .PARAMETER RestartService - Determines whether the service is automatically restarted. - - .PARAMETER Force - Forces the service account to be updated. - - .EXAMPLE - Test-TargetResource -SQLServer $env:COMPUTERNAME -SQLInstaneName MSSQLSERVER -ServiceType SqlServer -ServiceAccount $account - -#> -function Test-TargetResource -{ - [CmdletBinding()] - [OutputType([System.Boolean])] - param - ( - [Parameter(Mandatory = $true)] - [System.String] - $SQLServer, - - [Parameter(Mandatory = $true)] - [System.String] - $SQLInstanceName, - - [Parameter(Mandatory = $true)] - [ValidateSet('DatabaseEngine', 'SQLServerAgent', 'Search', 'IntegrationServices', 'AnalysisServices', 'ReportingServices', 'SQLServerBrowser', 'NotificationServices')] - [System.String] - $ServiceType, - - [Parameter(Mandatory = $true)] - [System.Management.Automation.PSCredential] - $ServiceAccount, - - [Parameter()] - [System.Boolean] - $RestartService, - - [Parameter()] - [System.Boolean] - $Force - ) - - if ($Force) - { - New-VerboseMessage -Message $script:localizedData.ForceServiceAccountUpdate - return $false - } - - # Get the current state - $currentState = Get-TargetResource -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName -ServiceType $ServiceType -ServiceAccount $ServiceAccount - New-VerboseMessage -Message ($script:localizedData.CurrentServiceAccount -f $currentState.ServiceAccount, $SQLServer, $SQLInstanceName) - - return ($currentState.ServiceAccount -ieq $ServiceAccount.UserName) -} - -<# - .SYNOPSIS - Sets the SQL Server service account to the desired state. - - .PARAMETER SQLServer - Host name of the SQL Server to manage. - - .PARAMETER SQLInstanceName - Name of the SQL instance. - - .PARAMETER ServiceType - Type of service to be managed. Must be one of the following: - DatabaseEngine, SQLServerAgent, Search, IntegrationServices, AnalysisServices, ReportingServices, SQLServerBrowser, NotificationServices. - - .PARAMETER ServiceAccount - Credential of the service account that should be used. - - .PARAMETER RestartService - Determines whether the service is automatically restarted. - - .PARAMETER Force - Forces the service account to be updated. - - .EXAMPLE - Set-TargetResource -SQLServer $env:COMPUTERNAME -SQLInstaneName MSSQLSERVER -ServiceType SqlServer -ServiceAccount $account -#> -function Set-TargetResource -{ - [CmdletBinding()] - param - ( - [Parameter(Mandatory = $true)] - [System.String] - $SQLServer, - - [Parameter(Mandatory = $true)] - [System.String] - $SQLInstanceName, - - [Parameter(Mandatory = $true)] - [ValidateSet('DatabaseEngine', 'SQLServerAgent', 'Search', 'IntegrationServices', 'AnalysisServices', 'ReportingServices', 'SQLServerBrowser', 'NotificationServices')] - [System.String] - $ServiceType, - - [Parameter(Mandatory = $true)] - [System.Management.Automation.PSCredential] - $ServiceAccount, - - [Parameter()] - [System.Boolean] - $RestartService, - - [Parameter()] - [System.Boolean] - $Force - ) - - # Get the Service object - $serviceObject = Get-ServiceObject -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName -ServiceType $ServiceType - - # If no service was found, throw an exception - if (-not $serviceObject) - { - $errorMessage = $script:localizedData.ServiceNotFound -f $ServiceType, $SQLServer, $SQLInstanceName - New-ObjectNotFoundException -Message $errorMessage - } - - try - { - New-VerboseMessage -Message ($script:localizedData.UpdatingServiceAccount -f $ServiceAccount.UserName, $serviceObject.Name) - $serviceObject.SetServiceAccount($ServiceAccount.UserName, $ServiceAccount.GetNetworkCredential().Password) - } - catch - { - $errorMessage = $script:localizedData.SetServiceAccountFailed -f $SQLServer, $SQLInstanceName, $_.Message - New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ - } - - if ($RestartService) - { - New-VerboseMessage -Message ($script:localizedData.RestartingService -f $SQLInstanceName) - Restart-SqlService -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName - } -} - -<# - .SYNOPSIS - Gets an SMO Service object instance for the requested service and type. - - .PARAMETER SQLServer - Host name of the SQL Server to manage. - - .PARAMETER SQLInstanceName - Name of the SQL instance. - - .PARAMETER ServiceType - Type of service to be managed. Must be one of the following: - DatabaseEngine, SQLServerAgent, Search, IntegrationServices, AnalysisServices, ReportingServices, SQLServerBrowser, NotificationServices. - - .EXAMPLE - Get-ServiceObject -SQLServer $env:COMPUTERNAME -SQLInstanceName MSSQLSERVER -ServiceType SqlServer -#> -function Get-ServiceObject -{ - [CmdletBinding()] - param - ( - [Parameter(Mandatory = $true)] - [System.String] - $SQLServer, - - [Parameter(Mandatory = $true)] - [System.String] - $SQLInstanceName, - - [Parameter(Mandatory = $true)] - [ValidateSet('DatabaseEngine', 'SQLServerAgent', 'Search', 'IntegrationServices', 'AnalysisServices', 'ReportingServices', 'SQLServerBrowser', 'NotificationServices')] - [System.String] - $ServiceType - ) - - # Load the SMO libraries - Import-SQLPSModule - - $verboseMessage = $script:localizedData.ConnectingToWmi -f $SQLServer - New-VerboseMessage -Message $verboseMessage - - # Connect to SQL WMI - $managedComputer = New-Object Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer $SQLServer - - # Change the regex pattern for a default instance - if ($SQLInstanceName -ieq 'MSSQLServer') - { - $serviceNamePattern = '^MSSQLServer$' - } - else - { - $serviceNamePattern = ('\${0}$' -f $SQLInstanceName) - } - - # Get the proper enum value - $serviceTypeFilter = ConvertTo-ManagedServiceType -ServiceType $ServiceType - - # Get the Service object for the specified instance/type - $serviceObject = $managedComputer.Services | Where-Object -FilterScript { - ($_.Type -eq $serviceTypeFilter) -and ($_.Name -imatch $serviceNamePattern) - } - - return $serviceObject -} - -<# - .SYNOPSIS - Converts the project's standard SQL Service types to the appropriate ManagedServiceType value - - .PARAMETER ServiceType - Type of service to be managed. Must be one of the following: - DatabaseEngine, SQLServerAgent, Search, IntegrationServices, AnalysisServices, ReportingServices, SQLServerBrowser, NotificationServices. - - .EXAMPLE - ConvertTo-ManagedServiceType -ServiceType 'DatabaseEngine' -#> -function ConvertTo-ManagedServiceType -{ - [CmdletBinding()] - param - ( - [Parameter(Mandatory = $true)] - [ValidateSet('DatabaseEngine', 'SQLServerAgent', 'Search', 'IntegrationServices', 'AnalysisServices', 'ReportingServices', 'SQLServerBrowser', 'NotificationServices')] - [System.String] - $ServiceType - ) - - # Map the project-specific ServiceType to a valid value from the ManagedServiceType enumeration - switch ($ServiceType) - { - 'DatabaseEngine' - { - $serviceTypeValue = 'SqlServer' - } - - 'SQLServerAgent' - { - $serviceTypeValue = 'SqlAgent' - } - - 'Search' - { - $serviceTypeValue = 'Search' - } - - 'IntegrationServices' - { - $serviceTypeValue = 'SqlServerIntegrationService' - } - - 'AnalysisServices' - { - $serviceTypeValue = 'AnalysisServer' - } - - 'ReportingServices' - { - $serviceTypeValue = 'ReportServer' - } - - 'SQLServerBrowser' - { - $serviceTypeValue = 'SqlBrowser' - } - - 'NotificationServices' - { - $serviceTypeValue = 'NotificationServer' - } - } - - return $serviceTypeValue -as [Microsoft.SqlServer.Management.Smo.Wmi.ManagedServiceType] -} diff --git a/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.schema.mof b/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.schema.mof deleted file mode 100644 index 5b96929c8..000000000 --- a/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.schema.mof +++ /dev/null @@ -1,10 +0,0 @@ -[ClassVersion("1.0.0.0"), FriendlyName("SqlServerServiceAccount")] -class MSFT_SqlServerServiceAccount : OMI_BaseResource -{ - [Key, Description("Hostname of the SQL Server.")] String SQLServer; - [Key, Description("Name of the SQL instance.")] String SQLInstanceName; - [Key, Description("Type of service being managed."), ValueMap {"DatabaseEngine","SQLServerAgent","Search","IntegrationServices","AnalysisServices","ReportingServices","SQLServerBrowser","NotificationServices"}, Values {"DatabaseEngine","SQLServerAgent","Search","IntegrationServices","AnalysisServices","ReportingServices","SQLServerBrowser","NotificationServices"}] String ServiceType; - [Required, EmbeddedInstance("MSFT_Credential"), Description("The service account that should be used when running the service.")] String ServiceAccount; - [Write, Description("Determines whether the service is automatically restarted.")] Boolean RestartService; - [Write, Description("Forces the service account to be updated. Useful for password changes.")] Boolean Force; -}; diff --git a/DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_SqlServerServiceAccount.strings.psd1 b/DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_SqlServerServiceAccount.strings.psd1 deleted file mode 100644 index e0b1330df..000000000 --- a/DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_SqlServerServiceAccount.strings.psd1 +++ /dev/null @@ -1,11 +0,0 @@ -# Localized resources for SqlServerServiceAccount - -ConvertFrom-StringData @' - ForceServiceAccountUpdate = Force specified, skipping tests. With this configuration, Test-TargetResource will always return 'False'. - CurrentServiceAccount = Current service account is '{0}' for {1}\{2}. - ConnectingToWmi = Connecting to WMI on '{0}'. - UpdatingServiceAccount = Setting service account to '{0}' for service {1}. - RestartingService = Restarting '{0}' and any dependent services. - ServiceNotFound = The {0} service on {1}\\{2} could not be found. - SetServiceAccountFailed = Unable to set the service account for {0} on {1}. Message {2} -'@ diff --git a/DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.schema.mof b/DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.schema.mof index 759e43071..c576243da 100644 --- a/DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.schema.mof +++ b/DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.schema.mof @@ -1,4 +1,4 @@ -[ClassVersion("1.0.0.0"), FriendlyName("SqlWaitForAG")] +[ClassVersion("1.0.0.0"), FriendlyName("MSFT_SqlWaitForAG")] class MSFT_SqlWaitForAG : OMI_BaseResource { [Key, Description("Name of the cluster role/group to look for (normally the same as the Availability Group name).")] String Name; diff --git a/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.psm1 b/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.psm1 deleted file mode 100644 index c369d1aa1..000000000 --- a/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.psm1 +++ /dev/null @@ -1,175 +0,0 @@ -Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDSCHelper.psm1') ` - -Force - -<# - .SYNOPSIS - Returns the cluster role/group that is waiting to be created, - along with the time and number of times to wait. - - .PARAMETER Name - Name of the cluster role/group to look for (normally the same as the Availability Group name). - - .PARAMETER RetryIntervalSec - The interval, in seconds, to check for the presence of the cluster role/group. - Default value is 20 seconds. - When the cluster role/group has been found the resource will wait for this amount of time once - more before returning. - - .PARAMETER RetryCount - Maximum number of retries until the resource will timeout and throw an error. Default values is 30 times. -#> -function Get-TargetResource -{ - [CmdletBinding()] - [OutputType([System.Collections.Hashtable])] - param - ( - [Parameter(Mandatory = $true)] - [System.String] - $Name, - - [Parameter()] - [System.UInt64] - $RetryIntervalSec = 20, - - [Parameter()] - [System.UInt32] - $RetryCount = 30 - ) - - $clusterGroupFound = $false - - $clusterGroup = Get-ClusterGroup -Name $Name -ErrorAction SilentlyContinue - if ($null -ne $clusterGroup) - { - $clusterGroupFound = $true - } - - return @{ - Name = $Name - RetryIntervalSec = $RetryIntervalSec - RetryCount = $RetryCount - GroupExist = $clusterGroupFound - } -} - -<# - .SYNOPSIS - Waits for a cluster role/group to be created - - .PARAMETER Name - Name of the cluster role/group to look for (normally the same as the Availability Group name). - - .PARAMETER RetryIntervalSec - The interval, in seconds, to check for the presence of the cluster role/group. - Default value is 20 seconds. - When the cluster role/group has been found the resource will wait for this amount of time once - more before returning. - - .PARAMETER RetryCount - Maximum number of retries until the resource will timeout and throw an error. Default values is 30 times. -#> -function Set-TargetResource -{ - [CmdletBinding()] - param - ( - [Parameter(Mandatory = $true)] - [System.String] - $Name, - - [Parameter()] - [System.UInt64] - $RetryIntervalSec = 20, - - [Parameter()] - [System.UInt32] - $RetryCount = 30 - ) - - New-VerboseMessage -Message "Checking for cluster group $Name. Will try for a total of $($RetryIntervalSec*$RetryCount) seconds." - - $getTargetResourceParameters = @{ - Name = $Name - RetryIntervalSec = $RetryIntervalSec - RetryCount = $RetryCount - } - - for ($forLoopCount = 0; $forLoopCount -lt $RetryCount; $forLoopCount++) - { - $clusterGroupFound = (Get-TargetResource @getTargetResourceParameters).GroupExist - if ($clusterGroupFound) - { - New-VerboseMessage -Message "Found cluster group $Name. Will sleep for another $RetryIntervalSec seconds before continuing." - Start-Sleep -Seconds $RetryIntervalSec - break - } - - New-VerboseMessage -Message "Cluster group $Name not found. Will retry again after $RetryIntervalSec sec" - Start-Sleep -Seconds $RetryIntervalSec - } - - if (-not $clusterGroupFound) - { - throw "Cluster group $Name not found after $RetryCount attempts with $RetryIntervalSec sec interval" - } -} - -<# - .SYNOPSIS - Tests if the cluster role/group has been created. - - .PARAMETER Name - Name of the cluster role/group to look for (normally the same as the Availability Group name). - - .PARAMETER RetryIntervalSec - The interval, in seconds, to check for the presence of the cluster role/group. - Default value is 20 seconds. - When the cluster role/group has been found the resource will wait for this amount of time once - more before returning. - - .PARAMETER RetryCount - Maximum number of retries until the resource will timeout and throw an error. Default values is 30 times. -#> -function Test-TargetResource -{ - [CmdletBinding()] - [OutputType([System.Boolean])] - param - ( - [Parameter(Mandatory = $true)] - [System.String] - $Name, - - [Parameter()] - [System.UInt64] - $RetryIntervalSec = 20, - - [Parameter()] - [System.UInt32] - $RetryCount = 30 - ) - - New-VerboseMessage -Message "Testing for cluster group $Name." - - $getTargetResourceParameters = @{ - Name = $Name - RetryIntervalSec = $RetryIntervalSec - RetryCount = $RetryCount - } - - $clusterGroupFound = (Get-TargetResource @getTargetResourceParameters).GroupExist - if ($clusterGroupFound) - { - New-VerboseMessage -Message "Found cluster group $Name" - } - else - { - New-VerboseMessage -Message "Cluster group $Name not found" - } - - return $clusterGroupFound -} - -Export-ModuleMember -Function *-TargetResource diff --git a/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.schema.mof b/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.schema.mof deleted file mode 100644 index a848cabba..000000000 --- a/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.schema.mof +++ /dev/null @@ -1,8 +0,0 @@ -[ClassVersion("1.0.0.0"), FriendlyName("SqlWaitForAvailabilityGroup")] -class MSFT_SqlWaitForAvailabilityGroup : OMI_BaseResource -{ - [Key, Description("Name of the cluster role/group to look for (normally the same as the Availability Group name).")] String Name; - [Write, Description("The interval, in seconds, to check for the presence of the cluster role/group. Default value is 20 seconds. When the cluster role/group has been found the resource will wait for this amount of time once more before returning.")] Uint64 RetryIntervalSec; - [Write, Description("Maximum number of retries until the resource will timeout and throw an error. Default values is 30 times.")] Uint32 RetryCount; - [Read, Description("Returns $true if the cluster role/group exist, otherwise it returns $false. Used by Get-TargetResource.")] Boolean GroupExist; -}; diff --git a/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 b/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 deleted file mode 100644 index 72273ff5a..000000000 --- a/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 +++ /dev/null @@ -1,27 +0,0 @@ -<# -.EXAMPLE - This example shows how to ensure the SQL Server service - on TestServer is running under a user account. -#> - -Configuration Example -{ - param( - [Parameter(Mandatory = $true)] - [PSCredential] - $ServiceAccountCredential - ) - - Import-DscResource -ModuleName SqlServerDsc - - Node localhost { - SqlServerServiceAccount SetServiceAcccount_User - { - SQLServer = 'TestServer' - SQLInstanceName = 'MSSQLSERVER' - ServiceType = 'DatabaseEngine' - ServiceAccount = $ServiceAccountCredential - RestartService = $true - } - } -} diff --git a/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 b/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 deleted file mode 100644 index 21b7227f1..000000000 --- a/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 +++ /dev/null @@ -1,31 +0,0 @@ -<# -.EXAMPLE - This example shows how to ensure the SQL Server service - on TestServer\DSC is running under a virtual account. - Force will cause this account to be set every time the - configuration is evaluated. Specifying RestartService will - cause the service to be restarted. -#> - -Configuration Example -{ - param( - [Parameter(Mandatory = $true)] - [PSCredential] - $ServiceAcccountCredential - ) - - Import-DscResource -ModuleName SqlServerDsc - - Node localhost { - SqlServerServiceAccount SetServiceAcccount_User - { - SQLServer = 'TestServer' - SQLInstanceName = 'DSC' - ServiceType = 'DatabaseEngine' - ServiceAccount = $ServiceAcccountCredential - RestartService = $true - Force = $true - } - } -} diff --git a/Examples/Resources/SqlServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 b/Examples/Resources/SqlServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 index 5d92cced8..72273ff5a 100644 --- a/Examples/Resources/SqlServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 +++ b/Examples/Resources/SqlServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 @@ -15,7 +15,7 @@ Configuration Example Import-DscResource -ModuleName SqlServerDsc Node localhost { - SqlServiceAccount SetServiceAcccount_User + SqlServerServiceAccount SetServiceAcccount_User { SQLServer = 'TestServer' SQLInstanceName = 'MSSQLSERVER' diff --git a/Examples/Resources/SqlServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 b/Examples/Resources/SqlServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 index 6a67ed0a7..21b7227f1 100644 --- a/Examples/Resources/SqlServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 +++ b/Examples/Resources/SqlServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 @@ -18,7 +18,7 @@ Configuration Example Import-DscResource -ModuleName SqlServerDsc Node localhost { - SqlServiceAccount SetServiceAcccount_User + SqlServerServiceAccount SetServiceAcccount_User { SQLServer = 'TestServer' SQLInstanceName = 'DSC' diff --git a/SQLServerDsc.psd1 b/SQLServerDsc.psd1 index b6f8cb987..cda0ab315 100644 --- a/SQLServerDsc.psd1 +++ b/SQLServerDsc.psd1 @@ -1,6 +1,6 @@ @{ # Version number of this module. -ModuleVersion = '9.0.0.0' +ModuleVersion = '8.2.0.0' # ID used to uniquely identify this module GUID = '74e9ddb5-4cbc-4fa2-a222-2bcfb533fd66' diff --git a/SqlServerDscHelper.psm1 b/SqlServerDscHelper.psm1 index 819166cf4..ff3da136d 100644 --- a/SqlServerDscHelper.psm1 +++ b/SqlServerDscHelper.psm1 @@ -3,7 +3,7 @@ Import-Module -Name (Join-Path -Path (Join-Path -Path $PSScriptRoot ` -ChildPath 'DscResources') ` -ChildPath 'CommonResourceHelper.psm1') -$script:localizedData = Get-LocalizedData -ResourceName 'SqlServerDSCHelper' -ScriptRoot $PSScriptRoot +$script:localizedData = Get-LocalizedData -ResourceName 'SqlServerDscHelper' -ScriptRoot $PSScriptRoot <# .SYNOPSIS diff --git a/en-US/SqlServerDscHelper.strings.psd1 b/en-US/SqlServerDscHelper.strings.psd1 index 2f19578a9..ab81b005b 100644 --- a/en-US/SqlServerDscHelper.strings.psd1 +++ b/en-US/SqlServerDscHelper.strings.psd1 @@ -17,7 +17,7 @@ ConvertFrom-StringData @' PropertiesDoesNotMatch = Found an array for property {0} in the current values, but this array does not match the desired state. Details of the changes are below. PropertyThatDoesNotMatch = {0} - {1} ValueOfTypeDoesNotMatch = {0} value for property {1} does not match. Current state is '{2}' and desired state is '{3}'. - UnableToCompareProperty = Unable to compare property {0} as the type {1} is not handled by the Test-SQLDscParameterState cmdlet. + UnableToCompareProperty = Unable to compare property {0} as the type {1} is not handled by the Test-SQLDSCParameterState cmdlet. PreferredModuleFound = Preferred module SqlServer found. PreferredModuleNotFound = Information: PowerShell module SqlServer not found, trying to use older SQLPS module. ImportingPowerShellModule = Importing PowerShell module {0}. From 205df6d65281d0ad87e2f84e7e48036d4e1b03fd Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 9 Nov 2017 14:37:32 -0600 Subject: [PATCH 34/42] correct build errors --- .../1-ConfigureServiceAccount-UserAccount.ps1 | 2 +- .../2-ConfigureServiceAccount-VirtualAccount.ps1 | 2 +- .../SqlWaitForAG/1-WaitForASingleClusterGroup.ps1 | 2 +- SQLServerDsc.psd1 | 11 ----------- Tests/Unit/MSFT_SqlWaitForAG.Tests.ps1 | 6 +++--- 5 files changed, 6 insertions(+), 17 deletions(-) diff --git a/Examples/Resources/SqlServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 b/Examples/Resources/SqlServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 index 72273ff5a..5d92cced8 100644 --- a/Examples/Resources/SqlServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 +++ b/Examples/Resources/SqlServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 @@ -15,7 +15,7 @@ Configuration Example Import-DscResource -ModuleName SqlServerDsc Node localhost { - SqlServerServiceAccount SetServiceAcccount_User + SqlServiceAccount SetServiceAcccount_User { SQLServer = 'TestServer' SQLInstanceName = 'MSSQLSERVER' diff --git a/Examples/Resources/SqlServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 b/Examples/Resources/SqlServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 index 21b7227f1..6a67ed0a7 100644 --- a/Examples/Resources/SqlServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 +++ b/Examples/Resources/SqlServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 @@ -18,7 +18,7 @@ Configuration Example Import-DscResource -ModuleName SqlServerDsc Node localhost { - SqlServerServiceAccount SetServiceAcccount_User + SqlServiceAccount SetServiceAcccount_User { SQLServer = 'TestServer' SQLInstanceName = 'DSC' diff --git a/Examples/Resources/SqlWaitForAG/1-WaitForASingleClusterGroup.ps1 b/Examples/Resources/SqlWaitForAG/1-WaitForASingleClusterGroup.ps1 index f78de9b44..d1566a51e 100644 --- a/Examples/Resources/SqlWaitForAG/1-WaitForASingleClusterGroup.ps1 +++ b/Examples/Resources/SqlWaitForAG/1-WaitForASingleClusterGroup.ps1 @@ -16,7 +16,7 @@ Configuration Example node localhost { - SqlWaitForAvailabilityGroup SQLConfigureAG-WaitAGTest1 + SqlWaitForAG SQLConfigureAG-WaitAGTest1 { Name = 'AGTest1' RetryIntervalSec = 20 diff --git a/SQLServerDsc.psd1 b/SQLServerDsc.psd1 index cda0ab315..3f7051cdb 100644 --- a/SQLServerDsc.psd1 +++ b/SQLServerDsc.psd1 @@ -156,14 +156,3 @@ PrivateData = @{ } # End of PrivateData hashtable } - - - - - - - - - - - diff --git a/Tests/Unit/MSFT_SqlWaitForAG.Tests.ps1 b/Tests/Unit/MSFT_SqlWaitForAG.Tests.ps1 index 8b21a4e3c..226dd6a65 100644 --- a/Tests/Unit/MSFT_SqlWaitForAG.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlWaitForAG.Tests.ps1 @@ -78,7 +78,7 @@ try RetryCount = $mockRetryCount } - Describe 'MSFT_SqlWaitForAvailabilityGroup\Get-TargetResource' -Tag 'Get' { + Describe 'MSFT_SqlWaitForAG\Get-TargetResource' -Tag 'Get' { BeforeEach { $testParameters = $mockDefaultParameters.Clone() @@ -142,7 +142,7 @@ try } - Describe 'MSFT_SqlWaitForAvailabilityGroup\Test-TargetResource' -Tag 'Test'{ + Describe 'MSFT_SqlWaitForAG\Test-TargetResource' -Tag 'Test'{ BeforeEach { $testParameters = $mockDefaultParameters.Clone() @@ -191,7 +191,7 @@ try Assert-VerifiableMock } - Describe 'MSFT_SqlWaitForAvailabilityGroup\Set-TargetResource' -Tag 'Set'{ + Describe 'MSFT_SqlWaitForAG\Set-TargetResource' -Tag 'Set'{ BeforeEach { $testParameters = $mockDefaultParameters.Clone() From e1e3120ee0b936df187f58030f5a7089fc4f0359 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Thu, 9 Nov 2017 15:34:40 -0600 Subject: [PATCH 35/42] error in waitforag schema file --- DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.schema.mof | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.schema.mof b/DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.schema.mof index c576243da..759e43071 100644 --- a/DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.schema.mof +++ b/DSCResources/MSFT_SqlWaitForAG/MSFT_SqlWaitForAG.schema.mof @@ -1,4 +1,4 @@ -[ClassVersion("1.0.0.0"), FriendlyName("MSFT_SqlWaitForAG")] +[ClassVersion("1.0.0.0"), FriendlyName("SqlWaitForAG")] class MSFT_SqlWaitForAG : OMI_BaseResource { [Key, Description("Name of the cluster role/group to look for (normally the same as the Availability Group name).")] String Name; From 2db3c0411e23c624b93beb40e4826d78cd13ab78 Mon Sep 17 00:00:00 2001 From: Michael Greene Date: Mon, 13 Nov 2017 06:28:29 -0600 Subject: [PATCH 36/42] Rename SQLAGDatabases to singular based on Issue 851 discussion --- .../MSFT_SqlAGDatabases.psm1 | 984 ----------- .../MSFT_SqlAGDatabases.schema.mof | 14 - .../en-US/MSFT_SqlAGDatabases.strings.psd1 | 15 - .../en-US/about_SqlAGDatabases.help.txt | 50 - .../1-AddDatabasesToAvailabilityGroup.ps1 | 120 -- ...2-RemoveDatabasesFromAvailabilityGroup.ps1 | 114 -- ...tchDefinedDatabasesInAvailabilityGroup.ps1 | 115 -- Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 | 1530 ----------------- 8 files changed, 2942 deletions(-) delete mode 100644 DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 delete mode 100644 DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.schema.mof delete mode 100644 DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 delete mode 100644 DSCResources/MSFT_SqlAGDatabases/en-US/about_SqlAGDatabases.help.txt delete mode 100644 Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 delete mode 100644 Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 delete mode 100644 Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 delete mode 100644 Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 diff --git a/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 b/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 deleted file mode 100644 index 190211a82..000000000 --- a/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 +++ /dev/null @@ -1,984 +0,0 @@ -Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDscHelper.psm1') ` - -Force - -Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` - -ChildPath 'CommonResourceHelper.psm1') - -$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlAGDatabases' - -<# - .SYNOPSIS - Gets the database membership of the specified availability group. - - .PARAMETER DatabaseName - The name of the database(s) to add to the availability group. This accepts wildcards. - - .PARAMETER SQLServer - Hostname of the SQL Server where the primary replica of the availability group lives. If the - availability group is not currently on this server, the resource will attempt to connect to the - server where the primary replica lives. - - .PARAMETER SQLInstanceName - Name of the SQL instance where the primary replica of the availability group lives. If the - availability group is not currently on this instance, the resource will attempt to connect to - the instance where the primary replica lives. - - .PARAMETER AvailabilityGroupName - The name of the availability group in which to manage the database membership(s). - - .PARAMETER BackupPath - The path used to seed the availability group replicas. This should be a path that is accessible - by all of the replicas. -#> -function Get-TargetResource -{ - [CmdletBinding()] - [OutputType([System.Collections.Hashtable])] - param - ( - [Parameter(Mandatory = $true)] - [System.String[]] - $DatabaseName, - - [Parameter(Mandatory = $true)] - [System.String] - $SQLServer, - - [Parameter(Mandatory = $true)] - [System.String] - $SQLInstanceName, - - [Parameter(Mandatory = $true)] - [System.String] - $AvailabilityGroupName, - - [Parameter(Mandatory = $true)] - [System.String] - $BackupPath - ) - - # Create an object that reflects the current configuration - $currentConfiguration = @{ - DatabaseName = @() - SQLServer = $SQLServer - SQLInstanceName = $SQLInstanceName - AvailabilityGroupName = '' - BackupPath = '' - Ensure = '' - Force = $false - MatchDatabaseOwner = $false - IsActiveNode = $false - } - - # Connect to the instance - $serverObject = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName - - # Is this node actively hosting the SQL instance? - $currentConfiguration.IsActiveNode = Test-ActiveNode -ServerObject $serverObject - - # Get the Availability group object - $availabilityGroup = $serverObject.AvailabilityGroups[$AvailabilityGroupName] - - if ( $availabilityGroup ) - { - $currentConfiguration.AvailabilityGroupName = $AvailabilityGroupName - - # Get the databases in the availability group - $currentConfiguration.DatabaseName = $availabilityGroup.AvailabilityDatabases | Select-Object -ExpandProperty Name - } - else - { - Write-Verbose -Message ($script:localizedData.AvailabilityGroupDoesNotExist -f $AvailabilityGroupName) - } - - return $currentConfiguration -} - -<# - .SYNOPSIS - Adds or removes databases to the specified availability group. - - .PARAMETER DatabaseName - The name of the database(s) to add to the availability group. This accepts wildcards. - - .PARAMETER SQLServer - Hostname of the SQL Server where the primary replica of the availability group lives. If the - availability group is not currently on this server, the resource will attempt to connect to the - server where the primary replica lives. - - .PARAMETER SQLInstanceName - Name of the SQL instance where the primary replica of the availability group lives. If the - availability group is not currently on this instance, the resource will attempt to connect to - the instance where the primary replica lives. - - .PARAMETER AvailabilityGroupName - The name of the availability group in which to manage the database membership(s). - - .PARAMETER BackupPath - The path used to seed the availability group replicas. This should be a path that is accessible - by all of the replicas. - - .PARAMETER Ensure - Specifies the membership of the database(s) in the availability group. The options are: - - - Present: The defined database(s) are added to the availability group. All other - databases that may be a member of the availability group are ignored. - - Absent: The defined database(s) are removed from the availability group. All other - databases that may be a member of the availability group are ignored. - - The default is 'Present'. - - .PARAMETER Force - When used with "Ensure = 'Present'" it ensures the specified database(s) are the only databases - that are a member of the specified Availability Group. - - This parameter is ignored when 'Ensure' is 'Absent'. - - .PARAMETER MatchDatabaseOwner - If set to $true, this ensures the database owner of the database on the primary replica is the - owner of the database on all secondary replicas. This requires the database owner is available - as a login on all replicas and that the PSDscRunAsCredential has impersonate permissions. - - If set to $false, the owner of the database will be the PSDscRunAsCredential. - - The default is '$true'. - - .PARAMETER ProcessOnlyOnActiveNode - Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server Instance. - Not used in Set-TargetResource. -#> -function Set-TargetResource -{ - [CmdletBinding()] - param - ( - [Parameter(Mandatory = $true)] - [System.String[]] - $DatabaseName, - - [Parameter(Mandatory = $true)] - [System.String] - $SQLServer, - - [Parameter(Mandatory = $true)] - [System.String] - $SQLInstanceName, - - [Parameter(Mandatory = $true)] - [System.String] - $AvailabilityGroupName, - - [Parameter(Mandatory = $true)] - [System.String] - $BackupPath, - - [Parameter()] - [ValidateSet('Present', 'Absent')] - [System.String] - $Ensure = 'Present', - - [Parameter()] - [Boolean] - $Force, - - [Parameter()] - [Boolean] - $MatchDatabaseOwner, - - [Parameter()] - [Boolean] - $ProcessOnlyOnActiveNode - ) - - Import-SQLPSModule - - # Connect to the defined instance - $serverObject = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName - - # Get the Availability Group - $availabilityGroup = $serverObject.AvailabilityGroups[$AvailabilityGroupName] - - # Make sure we're communicating with the primary replica in order to make changes to the replica - $primaryServerObject = Get-PrimaryReplicaServerObject -ServerObject $serverObject -AvailabilityGroup $availabilityGroup - - $getDatabasesToAddToAvailabilityGroupParameters = @{ - DatabaseName = $DatabaseName - Ensure = $Ensure - ServerObject = $primaryServerObject - AvailabilityGroup = $availabilityGroup - } - $databasesToAddToAvailabilityGroup = Get-DatabasesToAddToAvailabilityGroup @getDatabasesToAddToAvailabilityGroupParameters - - $getDatabasesToRemoveFromAvailabilityGroupParameters = @{ - DatabaseName = $DatabaseName - Ensure = $Ensure - Force = $Force - ServerObject = $primaryServerObject - AvailabilityGroup = $availabilityGroup - } - $databasesToRemoveFromAvailabilityGroup = Get-DatabasesToRemoveFromAvailabilityGroup @getDatabasesToRemoveFromAvailabilityGroupParameters - - # Create a hash table to store the databases that failed to be added to the Availability Group - $databasesToAddFailures = @{} - - # Create a hash table to store the databases that failed to be added to the Availability Group - $databasesToRemoveFailures = @{} - - if ( $databasesToAddToAvailabilityGroup.Count -gt 0 ) - { - Write-Verbose -Message ($script:localizedData.AddingDatabasesToAvailabilityGroup -f $AvailabilityGroupName, ( $databasesToAddToAvailabilityGroup -join ', ' )) - - # Get only the secondary replicas. Some tests do not need to be performed on the primary replica - $secondaryReplicas = $availabilityGroup.AvailabilityReplicas | Where-Object -FilterScript { $_.Role -ne 'Primary' } - - # Ensure the appropriate permissions are in place on all the replicas - if ( $MatchDatabaseOwner ) - { - $impersonatePermissionsStatus = @{} - - foreach ( $availabilityGroupReplica in $secondaryReplicas ) - { - $currentAvailabilityGroupReplicaServerObject = Connect-SQL -SQLServer $availabilityGroupReplica.Name - $impersonatePermissionsStatus.Add( - $availabilityGroupReplica.Name, - ( Test-ImpersonatePermissions -ServerObject $currentAvailabilityGroupReplicaServerObject ) - ) - } - - if ( $impersonatePermissionsStatus.Values -contains $false ) - { - $impersonatePermissionsMissingParameters = @( - [System.Security.Principal.WindowsIdentity]::GetCurrent().Name, - ( ( $impersonatePermissionsStatus.GetEnumerator() | Where-Object -FilterScript { -not $_.Value } | Select-Object -ExpandProperty Key ) -join ', ' ) - ) - throw ($script:localizedData.ImpersonatePermissionsMissing -f $impersonatePermissionsMissingParameters ) - } - } - - foreach ( $databaseToAddToAvailabilityGroup in $databasesToAddToAvailabilityGroup ) - { - $databaseObject = $primaryServerObject.Databases[$databaseToAddToAvailabilityGroup] - - <# - Verify the prerequisites prior to joining the database to the availability group - https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/prereqs-restrictions-recommendations-always-on-availability#a-nameprerequisitesfordbsa-availability-database-prerequisites-and-restrictions - #> - - # Create a hash table to store prerequisite check failures - $prerequisiteCheckFailures = @() - - $prerequisiteChecks = @{ - RecoveryModel = 'Full' - ReadOnly = $false - UserAccess = 'Multiple' - AutoClose = $false - AvailabilityGroupName = '' - IsMirroringEnabled = $false - } - - foreach ( $prerequisiteCheck in $prerequisiteChecks.GetEnumerator() ) - { - if ( $databaseObject.($prerequisiteCheck.Key) -ne $prerequisiteCheck.Value ) - { - $prerequisiteCheckFailures += "$($prerequisiteCheck.Key) is not $($prerequisiteCheck.Value)." - } - } - - # Cannot be a system database - if ( $databaseObject.ID -le 4 ) - { - $prerequisiteCheckFailures += 'The database cannot be a system database.' - } - - # If FILESTREAM is enabled, ensure FILESTREAM is enabled on all replica instances - if ( - ( -not [System.String]::IsNullOrEmpty($databaseObject.DefaultFileStreamFileGroup) ) ` - -or ( -not [System.String]::IsNullOrEmpty($databaseObject.FilestreamDirectoryName) ) ` - -or ( $databaseObject.FilestreamNonTransactedAccess -ne 'Off' ) - ) - { - $availabilityReplicaFilestreamLevel = @{} - foreach ( $availabilityGroupReplica in $secondaryReplicas ) - { - $connectSqlParameters = Split-FullSQLInstanceName -FullSQLInstanceName $availabilityGroupReplica.Name - $currentAvailabilityGroupReplicaServerObject = Connect-SQL @connectSqlParameters - $availabilityReplicaFilestreamLevel.Add($availabilityGroupReplica.Name, $currentAvailabilityGroupReplicaServerObject.FilestreamLevel) - } - - if ( $availabilityReplicaFilestreamLevel.Values -contains 'Disabled' ) - { - $availabilityReplicaFilestreamLevelDisabled = $availabilityReplicaFilestreamLevel.GetEnumerator() | Where-Object { $_.Value -eq 'Disabled' } | Select-Object -ExpandProperty Key - $prerequisiteCheckFailures += ( 'Filestream is disabled on the following instances: {0}' -f ( $availabilityReplicaFilestreamLevelDisabled -join ', ' ) ) - } - } - - # If the database is contained, ensure contained database authentication is enabled on all replica instances - if ( $databaseObject.ContainmentType -ne 'None' ) - { - $availabilityReplicaContainmentEnabled = @{} - foreach ( $availabilityGroupReplica in $secondaryReplicas ) - { - $connectSqlParameters = Split-FullSQLInstanceName -FullSQLInstanceName $availabilityGroupReplica.Name - $currentAvailabilityGroupReplicaServerObject = Connect-SQL @connectSqlParameters - $availabilityReplicaContainmentEnabled.Add($availabilityGroupReplica.Name, $currentAvailabilityGroupReplicaServerObject.Configuration.ContainmentEnabled.ConfigValue) - } - - if ( $availabilityReplicaContainmentEnabled.Values -notcontains 'None' ) - { - $availabilityReplicaContainmentNotEnabled = $availabilityReplicaContainmentEnabled.GetEnumerator() | Where-Object { $_.Value -eq 'None' } | Select-Object -ExpandProperty Key - $prerequisiteCheckFailures += ( 'Contained Database Authentication is not enabled on the following instances: {0}' -f ( $availabilityReplicaContainmentNotEnabled -join ', ' ) ) - } - } - - # Ensure the data and log file paths exist on all replicas - $databaseFileDirectories = @() - $databaseFileDirectories += $databaseObject.FileGroups.Files.FileName | ForEach-Object { Split-Path -Path $_ -Parent } - $databaseFileDirectories += $databaseObject.LogFiles.FileName | ForEach-Object { Split-Path -Path $_ -Parent } - $databaseFileDirectories = $databaseFileDirectories | Select-Object -Unique - - $availabilityReplicaMissingDirectories = @{} - foreach ( $availabilityGroupReplica in $secondaryReplicas ) - { - $connectSqlParameters = Split-FullSQLInstanceName -FullSQLInstanceName $availabilityGroupReplica.Name - $currentAvailabilityGroupReplicaServerObject = Connect-SQL @connectSqlParameters - - $missingDirectories = @() - foreach ( $databaseFileDirectory in $databaseFileDirectories ) - { - $fileExistsQuery = "EXEC master.dbo.xp_fileexist '$databaseFileDirectory'" - $fileExistsResult = Invoke-Query -SQLServer $currentAvailabilityGroupReplicaServerObject.NetName -SQLInstanceName $currentAvailabilityGroupReplicaServerObject.ServiceName -Database master -Query $fileExistsQuery -WithResults - - if ( $fileExistsResult.Tables.Rows.'File is a Directory' -ne 1 ) - { - $missingDirectories += $databaseFileDirectory - } - } - - if ( $missingDirectories.Count -gt 0 ) - { - $availabilityReplicaMissingDirectories.Add($availabilityGroupReplica, ( $missingDirectories -join ', ' )) - } - } - - if ( $availabilityReplicaMissingDirectories.Count -gt 0 ) - { - foreach ( $availabilityReplicaMissingDirectory in $availabilityReplicaMissingDirectories.GetEnumerator() ) - { - $prerequisiteCheckFailures += "The instance '$($availabilityReplicaMissingDirectory.Key.Name)' is missing the following directories: $($availabilityReplicaMissingDirectory.Value)" - } - } - - # If the database is TDE'd, ensure the certificate or asymmetric key is installed on all replicas - if ( $databaseObject.EncryptionEnabled ) - { - $databaseCertificateThumbprint = [System.BitConverter]::ToString($databaseObject.DatabaseEncryptionKey.Thumbprint) - $databaseCertificateName = $databaseObject.DatabaseEncryptionKey.EncryptorName - - $availabilityReplicaMissingCertificates = @{} - foreach ( $availabilityGroupReplica in $secondaryReplicas ) - { - $connectSqlParameters = Split-FullSQLInstanceName -FullSQLInstanceName $availabilityGroupReplica.Name - $currentAvailabilityGroupReplicaServerObject = Connect-SQL @connectSqlParameters - [System.Array]$installedCertificateThumbprints = $currentAvailabilityGroupReplicaServerObject.Databases['master'].Certificates | ForEach-Object { [System.BitConverter]::ToString($_.Thumbprint) } - - if ( $installedCertificateThumbprints -notcontains $databaseCertificateThumbprint ) - { - $availabilityReplicaMissingCertificates.Add($availabilityGroupReplica, $databaseCertificateName) - } - } - - if ( $availabilityReplicaMissingCertificates.Count -gt 0 ) - { - foreach ( $availabilityReplicaMissingCertificate in $availabilityReplicaMissingCertificates.GetEnumerator() ) - { - $prerequisiteCheckFailures += "The instance '$($availabilityReplicaMissingCertificate.Key.Name)' is missing the following certificates: $($availabilityReplicaMissingCertificate.Value)" - } - } - } - - if ( $prerequisiteCheckFailures.Count -eq 0 ) - { - $databaseFullBackupFile = Join-Path -Path $BackupPath -ChildPath "$($databaseObject.Name)_Full_$(Get-Date -Format 'yyyyMMddhhmmss').bak" - $databaseLogBackupFile = Join-Path -Path $BackupPath -ChildPath "$($databaseObject.Name)_Log_$(Get-Date -Format 'yyyyMMddhhmmss').trn" - - # Build the backup parameters. If no backup was previously taken, a standard full will be taken. Otherwise a CopyOnly backup will be taken. - $backupSqlDatabaseParameters = @{ - DatabaseObject = $databaseObject - BackupAction = 'Database' - BackupFile = $databaseFullBackupFile - ErrorAction = 'Stop' - } - - # If no full backup was ever taken, do not take a backup with CopyOnly - if ( $databaseObject.LastBackupDate -ne 0 ) - { - $backupSqlDatabaseParameters.Add('CopyOnly', $true) - } - - try - { - Backup-SqlDatabase @backupSqlDatabaseParameters - } - catch - { - # Log the failure - $databasesToAddFailures.Add($databaseToAddToAvailabilityGroup, $_.Exception) - - # Move on to the next database - continue - } - - # Create the parameters to perform a transaction log backup - $backupSqlDatabaseLogParams = @{ - DatabaseObject = $databaseObject - BackupAction = 'Log' - BackupFile = $databaseLogBackupFile - ErrorAction = 'Stop' - } - - try - { - Backup-SqlDatabase @backupSqlDatabaseLogParams - } - catch - { - # Log the failure - $databasesToAddFailures.Add($databaseToAddToAvailabilityGroup, $_.Exception) - - # Move on to the next database - continue - } - - # Add the database to the availability group on the primary instance - try - { - Add-SqlAvailabilityDatabase -InputObject $availabilityGroup -Database $databaseToAddToAvailabilityGroup - } - catch - { - # Log the failure - $databasesToAddFailures.Add($databaseToAddToAvailabilityGroup, $_.Exception) - - # Move on to the next database - continue - } - - # Need to restore the database with a query in order to impersonate the correct login - $restoreDatabaseQueryStringBuilder = New-Object -TypeName System.Text.StringBuilder - - if ( $MatchDatabaseOwner ) - { - $restoreDatabaseQueryStringBuilder.Append('EXECUTE AS LOGIN = ''') | Out-Null - $restoreDatabaseQueryStringBuilder.Append($databaseObject.Owner) | Out-Null - $restoreDatabaseQueryStringBuilder.AppendLine('''') | Out-Null - } - - $restoreDatabaseQueryStringBuilder.Append('RESTORE DATABASE [') | Out-Null - $restoreDatabaseQueryStringBuilder.Append($databaseToAddToAvailabilityGroup) | Out-Null - $restoreDatabaseQueryStringBuilder.AppendLine(']') | Out-Null - $restoreDatabaseQueryStringBuilder.Append('FROM DISK = ''') | Out-Null - $restoreDatabaseQueryStringBuilder.Append($databaseFullBackupFile) | Out-Null - $restoreDatabaseQueryStringBuilder.AppendLine('''') | Out-Null - $restoreDatabaseQueryStringBuilder.Append('WITH NORECOVERY') | Out-Null - $restoreDatabaseQueryString = $restoreDatabaseQueryStringBuilder.ToString() - - # Build the parameters to restore the transaction log - $restoreSqlDatabaseLogParameters = @{ - Database = $databaseToAddToAvailabilityGroup - BackupFile = $databaseLogBackupFile - RestoreAction = 'Log' - NoRecovery = $true - } - - try - { - foreach ( $availabilityGroupReplica in $secondaryReplicas ) - { - # Connect to the replica - $connectSqlParameters = Split-FullSQLInstanceName -FullSQLInstanceName $availabilityGroupReplica.Name - $currentAvailabilityGroupReplicaServerObject = Connect-SQL @connectSqlParameters - $currentReplicaAvailabilityGroupObject = $currentAvailabilityGroupReplicaServerObject.AvailabilityGroups[$AvailabilityGroupName] - - # Restore the database - Invoke-Query -SQLServer $currentAvailabilityGroupReplicaServerObject.NetName -SQLInstanceName $currentAvailabilityGroupReplicaServerObject.ServiceName -Database master -Query $restoreDatabaseQueryString - Restore-SqlDatabase -InputObject $currentAvailabilityGroupReplicaServerObject @restoreSqlDatabaseLogParameters - - # Add the database to the Availability Group - Add-SqlAvailabilityDatabase -InputObject $currentReplicaAvailabilityGroupObject -Database $databaseToAddToAvailabilityGroup - } - } - catch - { - # Log the failure - $databasesToAddFailures.Add($databaseToAddToAvailabilityGroup, $_.Exception) - - # Move on to the next database - continue - } - finally - { - # Clean up the backup files - Remove-Item -Path $databaseFullBackupFile, $databaseLogBackupFile -Force -ErrorAction Continue - } - } - else - { - $databasesToAddFailures.Add($databaseToAddToAvailabilityGroup, "The following prerequisite checks failed: $( $prerequisiteCheckFailures -join "`r`n" )" ) - } - } - } - - if ( $databasesToRemoveFromAvailabilityGroup.Count -gt 0 ) - { - Write-Verbose -Message ($script:localizedData.RemovingDatabasesToAvailabilityGroup -f $AvailabilityGroupName, ( $databasesToRemoveFromAvailabilityGroup -join ', ' )) - - foreach ( $databaseToAddToAvailabilityGroup in $databasesToRemoveFromAvailabilityGroup ) - { - $availabilityDatabase = $primaryServerObject.AvailabilityGroups[$AvailabilityGroupName].AvailabilityDatabases[$databaseToAddToAvailabilityGroup] - - try - { - Remove-SqlAvailabilityDatabase -InputObject $availabilityDatabase -ErrorAction Stop - } - catch - { - $databasesToRemoveFailures.Add($databaseToAddToAvailabilityGroup, 'Failed to remove the database from the availability group.') - } - } - } - - # Combine the failures into one error message and throw it here. Doing this will allow all the databases that can be processes to be processed and will still show that applying the configuration failed - if ( ( $databasesToAddFailures.Count -gt 0 ) -or ( $databasesToRemoveFailures.Count -gt 0 ) ) - { - $formatArgs = @() - foreach ( $failure in ( $databasesToAddFailures.GetEnumerator() + $databasesToRemoveFailures.GetEnumerator() ) ) - { - $formatArgs += "The operation on the database '$( $failure.Key )' failed with the following errors: $( $failure.Value -join "`r`n" )" - } - - throw ($script:localizedData.AlterAvailabilityGroupDatabaseMembershipFailure -f $formatArgs ) - } -} - -<# - .SYNOPSIS - Tests the database membership of the specified Availability Group. - - .PARAMETER DatabaseName - The name of the database(s) to add to the availability group. This accepts wildcards. - - .PARAMETER SQLServer - Hostname of the SQL Server where the primary replica of the availability group lives. If the - availability group is not currently on this server, the resource will attempt to connect to the - server where the primary replica lives. - - .PARAMETER SQLInstanceName - Name of the SQL instance where the primary replica of the availability group lives. If the - availability group is not currently on this instance, the resource will attempt to connect to - the instance where the primary replica lives. - - .PARAMETER AvailabilityGroupName - The name of the availability group in which to manage the database membership(s). - - .PARAMETER BackupPath - The path used to seed the availability group replicas. This should be a path that is accessible - by all of the replicas. - - .PARAMETER Ensure - Specifies the membership of the database(s) in the availability group. The options are: - - - Present: The defined database(s) are added to the availability group. All other - databases that may be a member of the availability group are ignored. - - Absent: The defined database(s) are removed from the availability group. All other - databases that may be a member of the availability group are ignored. - - The default is 'Present'. - - .PARAMETER Force - When used with "Ensure = 'Present'" it ensures the specified database(s) are the only databases - that are a member of the specified Availability Group. - - This parameter is ignored when 'Ensure' is 'Absent'. - - .PARAMETER MatchDatabaseOwner - If set to $true, this ensures the database owner of the database on the primary replica is the - owner of the database on all secondary replicas. This requires the database owner is available - as a login on all replicas and that the PSDscRunAsCredential has impersonate permissions. - - If set to $false, the owner of the database will be the PSDscRunAsCredential. - - The default is '$true'. - - .PARAMETER ProcessOnlyOnActiveNode - Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server Instance. -#> -function Test-TargetResource -{ - [CmdletBinding()] - [OutputType([System.Boolean])] - param - ( - [Parameter(Mandatory = $true)] - [System.String[]] - $DatabaseName, - - [Parameter(Mandatory = $true)] - [System.String] - $SQLServer, - - [Parameter(Mandatory = $true)] - [System.String] - $SQLInstanceName, - - [Parameter(Mandatory = $true)] - [System.String] - $AvailabilityGroupName, - - [Parameter(Mandatory = $true)] - [System.String] - $BackupPath, - - [Parameter()] - [ValidateSet('Present', 'Absent')] - [System.String] - $Ensure = 'Present', - - [Parameter()] - [Boolean] - $Force, - - [Parameter()] - [Boolean] - $MatchDatabaseOwner, - - [Parameter()] - [Boolean] - $ProcessOnlyOnActiveNode - ) - - $configurationInDesiredState = $true - - $getTargetResourceParameters = @{ - DatabaseName = $DatabaseName - SQLServer = $SQLServer - SQLInstanceName = $SQLInstanceName - AvailabilityGroupName = $AvailabilityGroupName - BackupPath = $BackupPath - } - $currentConfiguration = Get-TargetResource @getTargetResourceParameters - - <# - If this is supposed to process only the active node, and this is not the - active node, don't bother evaluating the test. - #> - if ( $ProcessOnlyOnActiveNode -and -not $currentConfiguration.IsActiveNode ) - { - Write-Verbose -Message ( $script:localizedData.NotActiveNode -f $env:COMPUTERNAME,$SQLInstanceName ) - return $configurationInDesiredState - } - - # Connect to the defined instance - $serverObject = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName - - # Get the Availability Group if it exists - if ( -not [string]::IsNullOrEmpty($currentConfiguration.AvailabilityGroupName) ) - { - $availabilityGroup = $serverObject.AvailabilityGroups[$AvailabilityGroupName] - - # Make sure we're communicating with the primary replica in order to make changes to the replica - $primaryServerObject = Get-PrimaryReplicaServerObject -ServerObject $serverObject -AvailabilityGroup $availabilityGroup - - $matchingDatabaseNames = Get-MatchingDatabaseNames -DatabaseName $DatabaseName -ServerObject $primaryServerObject - $databasesNotFoundOnTheInstance = @() - - if ( ( $Ensure -eq 'Present' ) -and $matchingDatabaseNames.Count -eq 0 ) - { - $configurationInDesiredState = $false - Write-Verbose -Message ($script:localizedData.DatabasesNotFound -f ($DatabaseName -join ', ')) - } - else - { - $databasesNotFoundOnTheInstance = Get-DatabaseNamesNotFoundOnTheInstance -DatabaseName $DatabaseName -MatchingDatabaseNames $matchingDatabaseNames - - # If the databases specified are not present on the instance and the desired state is not Absent - if ( ( $databasesNotFoundOnTheInstance.Count -gt 0 ) -and ( $Ensure -ne 'Absent' ) ) - { - $configurationInDesiredState = $false - Write-Verbose -Message ($script:localizedData.DatabasesNotFound -f ( $databasesNotFoundOnTheInstance -join ', ' )) - } - - $getDatabasesToAddToAvailabilityGroupParameters = @{ - DatabaseName = $DatabaseName - Ensure = $Ensure - ServerObject = $primaryServerObject - AvailabilityGroup = $availabilityGroup - } - $databasesToAddToAvailabilityGroup = Get-DatabasesToAddToAvailabilityGroup @getDatabasesToAddToAvailabilityGroupParameters - - if ( $databasesToAddToAvailabilityGroup.Count -gt 0 ) - { - $configurationInDesiredState = $false - Write-Verbose -Message ($script:localizedData.DatabaseShouldBeMember -f $AvailabilityGroupName, ( $databasesToAddToAvailabilityGroup -join ', ' )) - } - - $getDatabasesToRemoveFromAvailabilityGroupParameters = @{ - DatabaseName = $DatabaseName - Ensure = $Ensure - Force = $Force - ServerObject = $primaryServerObject - AvailabilityGroup = $availabilityGroup - } - $databasesToRemoveFromAvailabilityGroup = Get-DatabasesToRemoveFromAvailabilityGroup @getDatabasesToRemoveFromAvailabilityGroupParameters - - if ( $databasesToRemoveFromAvailabilityGroup.Count -gt 0 ) - { - $configurationInDesiredState = $false - Write-Verbose -Message ($script:localizedData.DatabaseShouldNotBeMember -f $AvailabilityGroupName, ( $databasesToRemoveFromAvailabilityGroup -join ', ' )) - } - } - } - else - { - $configurationInDesiredState = $false - Write-Verbose -Message ($script:localizedData.AvailabilityGroupDoesNotExist -f ($DatabaseName -join ', ')) - } - - return $configurationInDesiredState -} - -<# - .SYNOPSIS - Get the databases that should be members of the Availability Group. - - .PARAMETER DatabaseName - The name of the database(s) to add to the availability group. This accepts wildcards. - - .PARAMETER Ensure - Specifies the membership of the database(s) in the availability group. The options are: - - - Present: The defined database(s) are added to the availability group. All other - databases that may be a member of the availability group are ignored. - - Absent: The defined database(s) are removed from the availability group. All other - databases that may be a member of the availability group are ignored. - - .PARAMETER ServerObject - The server object the databases should be in. - - .PARAMETER AvailabilityGroup - The availability group object the databases should be a member of. -#> -function Get-DatabasesToAddToAvailabilityGroup -{ - [CmdletBinding()] - param - ( - [Parameter()] - [System.String[]] - $DatabaseName, - - [Parameter(Mandatory = $true)] - [System.String] - $Ensure, - - [Parameter(Mandatory = $true)] - [Microsoft.SqlServer.Management.Smo.Server] - $ServerObject, - - [Parameter(Mandatory = $true)] - [Microsoft.SqlServer.Management.Smo.AvailabilityGroup] - $AvailabilityGroup - ) - - $matchingDatabaseNames = Get-MatchingDatabaseNames -DatabaseName $DatabaseName -ServerObject $ServerObject - - # This is a hack to allow Compare-Object to work on an empty object - if ( $null -eq $matchingDatabaseNames ) - { - $MatchingDatabaseNames = @('') - } - - $databasesInAvailabilityGroup = $AvailabilityGroup.AvailabilityDatabases | Select-Object -ExpandProperty Name - - # This is a hack to allow Compare-Object to work on an empty object - if ( $null -eq $databasesInAvailabilityGroup ) - { - $databasesInAvailabilityGroup = @('') - } - - $comparisonResult = Compare-Object -ReferenceObject $matchingDatabaseNames -DifferenceObject $databasesInAvailabilityGroup - $databasesToAddToAvailabilityGroup = @() - - if ( $Ensure -eq 'Present' ) - { - $databasesToAddToAvailabilityGroup = $comparisonResult | Where-Object -FilterScript { $_.SideIndicator -eq '<=' } | Select-Object -ExpandProperty InputObject - } - - return $databasesToAddToAvailabilityGroup -} - -<# - .SYNOPSIS - Get the databases that should not be members of the Availability Group. - - .PARAMETER DatabaseName - The name of the database(s) to add to the availability group. This accepts wildcards. - - .PARAMETER Ensure - Specifies the membership of the database(s) in the availability group. The options are: - - - Present: The defined database(s) are added to the availability group. All other - databases that may be a member of the availability group are ignored. - - Absent: The defined database(s) are removed from the availability group. All other - databases that may be a member of the availability group are ignored. - - .PARAMETER Force - When used with "Ensure = 'Present'" it ensures the specified database(s) are the only databases - that are a member of the specified Availability Group. - - This parameter is ignored when 'Ensure' is 'Absent'. - - .PARAMETER ServerObject - The server object the databases should not be in. - - .PARAMETER AvailabilityGroup - The availability group object the databases should not be a member of. -#> -function Get-DatabasesToRemoveFromAvailabilityGroup -{ - [CmdletBinding()] - param - ( - [Parameter()] - [System.String[]] - $DatabaseName, - - [Parameter(Mandatory = $true)] - [System.String] - $Ensure, - - [Parameter()] - [Boolean] - $Force, - - [Parameter(Mandatory = $true)] - [Microsoft.SqlServer.Management.Smo.Server] - $ServerObject, - - [Parameter(Mandatory = $true)] - [Microsoft.SqlServer.Management.Smo.AvailabilityGroup] - $AvailabilityGroup - ) - - $matchingDatabaseNames = Get-MatchingDatabaseNames -DatabaseName $DatabaseName -ServerObject $ServerObject - - - if ( $null -eq $matchingDatabaseNames ) - { - $MatchingDatabaseNames = @('') - } - - $databasesInAvailabilityGroup = $AvailabilityGroup.AvailabilityDatabases | Select-Object -ExpandProperty Name - - # This is a hack to allow Compare-Object to work on an empty object - if ( $null -eq $databasesInAvailabilityGroup ) - { - $databasesInAvailabilityGroup = @('') - } - - $comparisonResult = Compare-Object -ReferenceObject $matchingDatabaseNames -DifferenceObject $databasesInAvailabilityGroup -IncludeEqual - - $databasesToRemoveFromAvailabilityGroup = @() - - if ( 'Absent' -eq $Ensure ) - { - $databasesToRemoveFromAvailabilityGroup = $comparisonResult | Where-Object -FilterScript { '==' -eq $_.SideIndicator } | Select-Object -ExpandProperty InputObject - } - elseif ( ( 'Present' -eq $Ensure ) -and ( $Force ) ) - { - $databasesToRemoveFromAvailabilityGroup = $comparisonResult | Where-Object -FilterScript { '=>' -eq $_.SideIndicator } | Select-Object -ExpandProperty InputObject - } - - return $databasesToRemoveFromAvailabilityGroup -} - -<# - .SYNOPSIS - Get the database names that were specified in the configuration that do not exist on the instance. - - .PARAMETER DatabaseName - The name of the database(s) to add to the availability group. This accepts wildcards. - - .PARAMETER MatchingDatabaseNames - All of the databases names that match the supplied names and wildcards. -#> -function Get-MatchingDatabaseNames -{ - [CmdletBinding()] - param - ( - [Parameter()] - [System.String[]] - $DatabaseName, - - [Parameter(Mandatory = $true)] - [Microsoft.SqlServer.Management.Smo.Server] - $ServerObject - ) - - $matchingDatabaseNames = @() - - foreach ( $dbName in $DatabaseName ) - { - $matchingDatabaseNames += $ServerObject.Databases | Where-Object -FilterScript { $_.Name -like $dbName } | Select-Object -ExpandProperty Name - } - - return $matchingDatabaseNames -} - -<# - .SYNOPSIS - Get the database names that were defined in the DatabaseName property but were not found on the instance. - - .PARAMETER DatabaseName - The name of the database(s) to add to the availability group. This accepts wildcards. - - .PARAMETER MatchingDatabaseNames - All of the database names that were found on the instance that match the supplied DatabaseName property. -#> -function Get-DatabaseNamesNotFoundOnTheInstance -{ - [CmdletBinding()] - param - ( - [Parameter()] - [System.String[]] - $DatabaseName, - - [Parameter()] - [System.String[]] - $MatchingDatabaseNames - ) - - $databasesNotFoundOnTheInstance = @{} - foreach ( $dbName in $DatabaseName ) - { - # Assume the database name was not found - $databaseToAddToAvailabilityGroupNotFound = $true - - foreach ( $matchingDatabaseName in $matchingDatabaseNames ) - { - if ( $matchingDatabaseName -like $dbName ) - { - # If we found the database name, it's not missing - $databaseToAddToAvailabilityGroupNotFound = $false - } - } - - $databasesNotFoundOnTheInstance.Add($dbName, $databaseToAddToAvailabilityGroupNotFound) - } - - $result = $databasesNotFoundOnTheInstance.GetEnumerator() | Where-Object -FilterScript { $_.Value } | Select-Object -ExpandProperty Key - - return $result -} diff --git a/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.schema.mof b/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.schema.mof deleted file mode 100644 index 795e6c729..000000000 --- a/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.schema.mof +++ /dev/null @@ -1,14 +0,0 @@ -[ClassVersion("1.0.0.0"), FriendlyName("SqlAGDatabases")] -class MSFT_SqlAGDatabases : OMI_BaseResource -{ - [Required, Description("The name of the database(s) to add to the availability group. This accepts wildcards.")] String DatabaseName[]; - [Key, Description("Hostname of the SQL Server where the primary replica of the availability group lives. If the availability group is not currently on this server, the resource will attempt to connect to the server where the primary replica lives.")] String SQLServer; - [Key, Description("Name of the SQL instance to be configured.")] String SQLInstanceName; - [Key, Description("The name of the availability group in which to manage the database membership(s).")] String AvailabilityGroupName; - [Required, Description("The path used to seed the availability group replicas. This should be a path that is accessible by all of the replicas")] String BackupPath; - [Write, Description("Specifies the membership of the database(s) in the availability group. The options are: Present: The defined database(s) are added to the availability group. All other databases that may be a member of the availability group are ignored. Absent: The defined database(s) are removed from the availability group. All other databases that may be a member of the availability group are ignored. The default is 'Present'."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; - [Write, Description("When used with 'Ensure = 'Present'' it ensures the specified database(s) are the only databases that are a member of the specified Availability Group. This parameter is ignored when 'Ensure' is 'Absent'.")] Boolean Force; - [Write, Description("If set to $true, this ensures the database owner of the database on the primary replica is the owner of the database on all secondary replicas. This requires the database owner is available as a login on all replicas and that the PSDscRunAsAccount has impersonate permissions. If set to $false, the owner of the database will be the PSDscRunAsAccount. The default is '$true'")] Boolean MatchDatabaseOwner; - [Write, Description("Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server Instance.")] Boolean ProcessOnlyOnActiveNode; - [Read, Description("Determines if the current node is actively hosting the SQL Server instance.")] Boolean IsActiveNode; -}; diff --git a/DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 b/DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 deleted file mode 100644 index c8fd93ed7..000000000 --- a/DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 +++ /dev/null @@ -1,15 +0,0 @@ -# Localized resources for SqlAGDatabases - -ConvertFrom-StringData @' - AddingDatabasesToAvailabilityGroup = Adding the following databases to the '{0}' availability group: {1}. - AlterAvailabilityGroupDatabaseMembershipFailure = {0}. - AvailabilityGroupDoesNotExist = The availability group '{0}' does not exist. - DatabaseShouldBeMember = The following databases should be a member of the availability group '{0}': {1}. - DatabaseShouldNotBeMember = The following databases should not be a member of the availability group '{0}': {1}. - DatabasesNotFound = The following databases were not found in the instance: {0}. - ImpersonatePermissionsMissing = The login '{0}' is missing impersonate permissions in the instances '{1}'. - NotActiveNode = The node '{0}' is not actively hosting the instance '{1}'. Exiting the test. - ParameterNotOfType = The parameter '{0}' is not of the type '{1}'. - ParameterNullOrEmpty = The parameter '{0}' is NULL or empty. - RemovingDatabasesToAvailabilityGroup = Removing the following databases from the '{0}' availability group: {1}. -'@ diff --git a/DSCResources/MSFT_SqlAGDatabases/en-US/about_SqlAGDatabases.help.txt b/DSCResources/MSFT_SqlAGDatabases/en-US/about_SqlAGDatabases.help.txt deleted file mode 100644 index eaab5b464..000000000 --- a/DSCResources/MSFT_SqlAGDatabases/en-US/about_SqlAGDatabases.help.txt +++ /dev/null @@ -1,50 +0,0 @@ -SYNOPSIS - Adds or removes databases to the specified availability group. - -PARAMETER DatabaseName - The name of the database(s) to add to the availability group. This accepts wildcards. - -PARAMETER SQLServer - Hostname of the SQL Server where the primary replica of the availability group lives. If the - availability group is not currently on this server, the resource will attempt to connect to the - server where the primary replica lives. - -PARAMETER SQLInstanceName - Name of the SQL instance where the primary replica of the availability group lives. If the - availability group is not currently on this instance, the resource will attempt to connect to - the instance where the primary replica lives. - -PARAMETER AvailabilityGroupName - The name of the availability group in which to manage the database membership(s). - -PARAMETER BackupPath - The path used to seed the availability group replicas. This should be a path that is accessible - by all of the replicas. - -PARAMETER Ensure - Specifies the membership of the database(s) in the availability group. The options are: - - - Present: The defined database(s) are added to the availability group. All other - databases that may be a member of the availability group are ignored. - - Absent: The defined database(s) are removed from the availability group. All other - databases that may be a member of the availability group are ignored. - - The default is 'Present'. - -PARAMETER Force - When used with "Ensure = 'Present'" it ensures the specified database(s) are the only databases - that are a member of the specified Availability Group. - - This parameter is ignored when 'Ensure' is 'Absent'. - -PARAMETER MatchDatabaseOwner - If set to $true, this ensures the database owner of the database on the primary replica is the - owner of the database on all secondary replicas. This requires the database owner is available - as a login on all replicas and that the PSDscRunAsCredential has impersonate permissions. - - If set to $false, the owner of the database will be the PSDscRunAsCredential. - - The default is '$true'. - -.PARAMETER ProcessOnlyOnActiveNode - Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server Instance. diff --git a/Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 b/Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 deleted file mode 100644 index 683d631fd..000000000 --- a/Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 +++ /dev/null @@ -1,120 +0,0 @@ -<# -.EXAMPLE - This example shows how to ensure that the databases 'DB*' and 'AdventureWorks' are members in the Availability Group 'TestAG'. - - In the event this is applied to a Failover Cluster Instance (FCI), the - ProcessOnlyOnActiveNode property will tell the Test-TargetResource function - to evaluate if any changes are needed if the node is actively hosting the - SQL Server Instance. -#> - -$ConfigurationData = @{ - AllNodes = @( - @{ - NodeName = '*' - SQLInstanceName = 'MSSQLSERVER' - AvailabilityGroupName = 'TestAG' - }, - - @{ - NodeName = 'SQL1' - Role = 'PrimaryReplica' - }, - - @{ - NodeName = 'SQL2' - Role = 'SecondaryReplica' - } - ) -} - -Configuration Example -{ - param( - [Parameter(Mandatory = $true)] - [PSCredential] - $SysAdminAccount - ) - - Import-DscResource -ModuleName SqlServerDsc - - Node $AllNodes.NodeName { - # Adding the required service account to allow the cluster to log into SQL - SqlServerLogin AddNTServiceClusSvc - { - Ensure = 'Present' - Name = 'NT SERVICE\ClusSvc' - LoginType = 'WindowsUser' - SQLServer = $Node.NodeName - SQLInstanceName = $Node.SQLInstanceName - PsDscRunAsCredential = $SysAdminAccount - } - - # Add the required permissions to the cluster service login - SqlServerPermission AddNTServiceClusSvcPermissions - { - DependsOn = '[SqlServerLogin]AddNTServiceClusSvc' - Ensure = 'Present' - NodeName = $Node.NodeName - InstanceName = $Node.SqlInstanceName - Principal = 'NT SERVICE\ClusSvc' - Permission = 'AlterAnyAvailabilityGroup', 'ViewServerState' - PsDscRunAsCredential = $SysAdminAccount - } - - # Create a DatabaseMirroring endpoint - SqlServerEndpoint HADREndpoint - { - EndPointName = 'HADR' - Ensure = 'Present' - Port = 5022 - SQLServer = $Node.NodeName - SQLInstanceName = $Node.SQLInstanceName - PsDscRunAsCredential = $SysAdminAccount - } - - if ( $Node.Role -eq 'PrimaryReplica' ) - { - # Create the availability group on the instance tagged as the primary replica - SqlAG AddTestAG - { - Ensure = 'Present' - Name = $Node.AvailabilityGroupName - SQLInstanceName = $Node.SQLInstanceName - SQLServer = $Node.NodeName - DependsOn = '[SqlServerEndpoint]HADREndpoint', '[SqlServerPermission]AddNTServiceClusSvcPermissions' - PsDscRunAsCredential = $SysAdminAccount - } - } - - if ( $Node.Role -eq 'SecondaryReplica' ) - { - # Add the availability group replica to the availability group - SqlAGReplica AddReplica - { - Ensure = 'Present' - Name = $Node.NodeName - AvailabilityGroupName = $Node.AvailabilityGroupName - SQLServer = $Node.NodeName - SQLInstanceName = $Node.SQLInstanceName - PrimaryReplicaSQLServer = ( $AllNodes | Where-Object { $_.Role -eq 'PrimaryReplica' } ).NodeName - PrimaryReplicaSQLInstanceName = ( $AllNodes | Where-Object { $_.Role -eq 'PrimaryReplica' } ).SQLInstanceName - } - } - - if ( $Node.Role -eq 'PrimaryReplica' ) - { - SqlAGDatabases 'TestAGDatabaseMemberships' - { - AvailabilityGroupName = $Node.AvailabilityGroupName - BackupPath = '\\SQL1\AgInitialize' - DatabaseName = 'DB*', 'AdventureWorks' - SQLInstanceName = $Node.SQLInstanceName - SQLServer = $Node.NodeName - Ensure = 'Present' - ProcessOnlyOnActiveNode = $true - PsDscRunAsCredential = $SysAdminAccount - } - } - } -} diff --git a/Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 b/Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 deleted file mode 100644 index aebf3956e..000000000 --- a/Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 +++ /dev/null @@ -1,114 +0,0 @@ -<# -.EXAMPLE - This example shows how to ensure that the databases 'DB*' and 'AdventureWorks' are not members of the Availability Group 'TestAG'. -#> - -$ConfigurationData = @{ - AllNodes = @( - @{ - NodeName = '*' - SQLInstanceName = 'MSSQLSERVER' - AvailabilityGroupName = 'TestAG' - }, - - @{ - NodeName = 'SQL1' - Role = 'PrimaryReplica' - }, - - @{ - NodeName = 'SQL2' - Role = 'SecondaryReplica' - } - ) -} - -Configuration Example -{ - param( - [Parameter(Mandatory = $true)] - [PSCredential] - $SysAdminAccount - ) - - Import-DscResource -ModuleName SqlServerDsc - - Node $AllNodes.NodeName { - # Adding the required service account to allow the cluster to log into SQL - SqlServerLogin AddNTServiceClusSvc - { - Ensure = 'Present' - Name = 'NT SERVICE\ClusSvc' - LoginType = 'WindowsUser' - SQLServer = $Node.NodeName - SQLInstanceName = $Node.SQLInstanceName - PsDscRunAsCredential = $SysAdminAccount - } - - # Add the required permissions to the cluster service login - SqlServerPermission AddNTServiceClusSvcPermissions - { - DependsOn = '[SqlServerLogin]AddNTServiceClusSvc' - Ensure = 'Present' - NodeName = $Node.NodeName - InstanceName = $Node.SqlInstanceName - Principal = 'NT SERVICE\ClusSvc' - Permission = 'AlterAnyAvailabilityGroup', 'ViewServerState' - PsDscRunAsCredential = $SysAdminAccount - } - - # Create a DatabaseMirroring endpoint - SqlServerEndpoint HADREndpoint - { - EndPointName = 'HADR' - Ensure = 'Present' - Port = 5022 - SQLServer = $Node.NodeName - SQLInstanceName = $Node.SQLInstanceName - PsDscRunAsCredential = $SysAdminAccount - } - - if ( $Node.Role -eq 'PrimaryReplica' ) - { - # Create the availability group on the instance tagged as the primary replica - SqlAG AddTestAG - { - Ensure = 'Present' - Name = $Node.AvailabilityGroupName - SQLInstanceName = $Node.SQLInstanceName - SQLServer = $Node.NodeName - DependsOn = '[SqlServerEndpoint]HADREndpoint', '[SqlServerPermission]AddNTServiceClusSvcPermissions' - PsDscRunAsCredential = $SysAdminAccount - } - } - - if ( $Node.Role -eq 'SecondaryReplica' ) - { - # Add the availability group replica to the availability group - SqlAGReplica AddReplica - { - Ensure = 'Present' - Name = $Node.NodeName - AvailabilityGroupName = $Node.AvailabilityGroupName - SQLServer = $Node.NodeName - SQLInstanceName = $Node.SQLInstanceName - PrimaryReplicaSQLServer = ( $AllNodes | Where-Object { $_.Role -eq 'PrimaryReplica' } ).NodeName - PrimaryReplicaSQLInstanceName = ( $AllNodes | Where-Object { $_.Role -eq 'PrimaryReplica' } ).SQLInstanceName - } - } - - if ( $Node.Role -eq 'PrimaryReplica' ) - { - SqlAGDatabases 'TestAGDatabaseMemberships' - { - AvailabilityGroupName = $Node.AvailabilityGroupName - BackupPath = '\\SQL1\AgInitialize' - DatabaseName = 'DB*', 'AdventureWorks' - SQLInstanceName = $Node.SQLInstanceName - SQLServer = $Node.NodeName - Ensure = 'Absent' - PsDscRunAsCredential = $SysAdminAccount - } - } - } -} diff --git a/Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 b/Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 deleted file mode 100644 index 794b25fd2..000000000 --- a/Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 +++ /dev/null @@ -1,115 +0,0 @@ -<# -.EXAMPLE - This example shows how to ensure that the databases 'DB*' and 'AdventureWorks' are the only members of the Availability Group 'TestAG'. -#> - -$ConfigurationData = @{ - AllNodes = @( - @{ - NodeName = '*' - SQLInstanceName = 'MSSQLSERVER' - AvailabilityGroupName = 'TestAG' - }, - - @{ - NodeName = 'SQL1' - Role = 'PrimaryReplica' - }, - - @{ - NodeName = 'SQL2' - Role = 'SecondaryReplica' - } - ) -} - -Configuration Example -{ - param( - [Parameter(Mandatory = $true)] - [PSCredential] - $SysAdminAccount - ) - - Import-DscResource -ModuleName SqlServerDsc - - Node $AllNodes.NodeName { - # Adding the required service account to allow the cluster to log into SQL - SqlServerLogin AddNTServiceClusSvc - { - Ensure = 'Present' - Name = 'NT SERVICE\ClusSvc' - LoginType = 'WindowsUser' - SQLServer = $Node.NodeName - SQLInstanceName = $Node.SQLInstanceName - PsDscRunAsCredential = $SysAdminAccount - } - - # Add the required permissions to the cluster service login - SqlServerPermission AddNTServiceClusSvcPermissions - { - DependsOn = '[SqlServerLogin]AddNTServiceClusSvc' - Ensure = 'Present' - NodeName = $Node.NodeName - InstanceName = $Node.SqlInstanceName - Principal = 'NT SERVICE\ClusSvc' - Permission = 'AlterAnyAvailabilityGroup', 'ViewServerState' - PsDscRunAsCredential = $SysAdminAccount - } - - # Create a DatabaseMirroring endpoint - SqlServerEndpoint HADREndpoint - { - EndPointName = 'HADR' - Ensure = 'Present' - Port = 5022 - SQLServer = $Node.NodeName - SQLInstanceName = $Node.SQLInstanceName - PsDscRunAsCredential = $SysAdminAccount - } - - if ( $Node.Role -eq 'PrimaryReplica' ) - { - # Create the availability group on the instance tagged as the primary replica - SqlAG AddTestAG - { - Ensure = 'Present' - Name = $Node.AvailabilityGroupName - SQLInstanceName = $Node.SQLInstanceName - SQLServer = $Node.NodeName - DependsOn = '[SqlServerEndpoint]HADREndpoint', '[SqlServerPermission]AddNTServiceClusSvcPermissions' - PsDscRunAsCredential = $SysAdminAccount - } - } - - if ( $Node.Role -eq 'SecondaryReplica' ) - { - # Add the availability group replica to the availability group - SqlAGReplica AddReplica - { - Ensure = 'Present' - Name = $Node.NodeName - AvailabilityGroupName = $Node.AvailabilityGroupName - SQLServer = $Node.NodeName - SQLInstanceName = $Node.SQLInstanceName - PrimaryReplicaSQLServer = ( $AllNodes | Where-Object { $_.Role -eq 'PrimaryReplica' } ).NodeName - PrimaryReplicaSQLInstanceName = ( $AllNodes | Where-Object { $_.Role -eq 'PrimaryReplica' } ).SQLInstanceName - } - } - - if ( $Node.Role -eq 'PrimaryReplica' ) - { - SqlAGDatabases 'TestAGDatabaseMemberships' - { - AvailabilityGroupName = $Node.AvailabilityGroupName - BackupPath = '\\SQL1\AgInitialize' - DatabaseName = 'DB*', 'AdventureWorks' - SQLInstanceName = $Node.SQLInstanceName - SQLServer = $Node.NodeName - Ensure = 'Present' - Force = $true - PsDscRunAsCredential = $SysAdminAccount - } - } - } -} diff --git a/Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 b/Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 deleted file mode 100644 index fdf324e13..000000000 --- a/Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 +++ /dev/null @@ -1,1530 +0,0 @@ -#region HEADER - -# Unit Test Template Version: 1.2.0 -$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) -if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` - (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) -{ - & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) -} - -Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force -Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent | Split-Path -Parent) -ChildPath 'SqlServerDscHelper.psm1') -Scope Global -Force -Import-Module -Name ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stubs ) -ChildPath SQLPSStub.psm1 ) -Force -Global - -# Loading mocked classes -Add-Type -Path ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stubs ) -ChildPath SMO.cs ) - -$TestEnvironment = Initialize-TestEnvironment ` - -DSCModuleName 'SqlServerDsc' ` - -DSCResourceName 'MSFT_SqlAGDatabases' ` - -TestType Unit - -#endregion HEADER - -function Invoke-TestSetup { - -} - -function Invoke-TestCleanup { - Restore-TestEnvironment -TestEnvironment $TestEnvironment - - # TODO: Other Optional Cleanup Code Goes Here... -} - -# Begin Testing -try -{ - Invoke-TestSetup - - InModuleScope 'MSFT_SqlAGDatabases' { - - #region Parameter Mocks - - # The databases defined in the resource - $mockDatabaseNameParameter = @( - 'DB*' - 'AnotherDB' - '3rd*OfDatabase' - '4th*OfDatabase' - ) - - $mockDatabaseNameParameterWithNonExistingDatabases = @( - 'NotFound*' - 'Unknown1' - ) - - $mockBackupPath = 'X:\Backup' - - $mockProcessOnlyOnActiveNode = $false - - #endregion Parameter Mocks - - #region mock names - - $mockServerObjectDomainInstanceName = 'Server1' - $mockPrimaryServerObjectDomainInstanceName = 'Server2' - $mockAvailabilityGroupObjectName = 'AvailabilityGroup1' - $mockAvailabilityGroupWithoutDatabasesObjectName = 'AvailabilityGroupWithoutDatabases' - $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServerName = 'AvailabilityGroup2' - - #endregion mock names - - #region Availability Replica Mocks - - $mockAvailabilityReplicaObjects = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityReplicaCollection - foreach ( $mockAvailabilityReplicaName in @('Server1','Server2') ) - { - $newAvailabilityReplicaObject = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityReplica - $newAvailabilityReplicaObject.Name = $mockAvailabilityReplicaName - - if ( $mockServerObjectDomainInstanceName -eq $mockAvailabilityReplicaName ) - { - $newAvailabilityReplicaObject.Role = 'Primary' - } - - $mockAvailabilityReplicaObjects.Add($newAvailabilityReplicaObject) - } - - #endregion Availability Replica Mocks - - #region Availability Group Mocks - - $mockAvailabilityDatabaseNames = @( - 'DB2' - '3rdTypeOfDatabase' - 'UndefinedDatabase' - ) - - $mockAvailabilityDatabaseAbsentResults = @( - 'DB2' - '3rdTypeOfDatabase' - ) - - $mockAvailabilityDatabaseExactlyAddResults = @( - 'DB1' - ) - - $mockAvailabilityDatabaseExactlyRemoveResults = @( - 'UndefinedDatabase' - ) - - $mockAvailabilityDatabasePresentResults = @( - 'DB1' - ) - - $mockAvailabilityDatabaseObjects = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityDatabaseCollection - foreach ( $mockAvailabilityDatabaseName in $mockAvailabilityDatabaseNames ) - { - $newAvailabilityDatabaseObject = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityDatabase - $newAvailabilityDatabaseObject.Name = $mockAvailabilityDatabaseName - $mockAvailabilityDatabaseObjects.Add($newAvailabilityDatabaseObject) - } - - $mockBadAvailabilityGroupObject = New-Object -TypeName Object - - $mockAvailabilityGroupObject = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityGroup - $mockAvailabilityGroupObject.AvailabilityDatabases = $mockAvailabilityDatabaseObjects - $mockAvailabilityGroupObject.Name = $mockAvailabilityGroupObjectName - $mockAvailabilityGroupObject.PrimaryReplicaServerName = $mockServerObjectDomainInstanceName - $mockAvailabilityGroupObject.AvailabilityReplicas = $mockAvailabilityReplicaObjects - - $mockAvailabilityGroupWithoutDatabasesObject = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityGroup - $mockAvailabilityGroupWithoutDatabasesObject.Name = $mockAvailabilityGroupWithoutDatabasesObjectName - $mockAvailabilityGroupWithoutDatabasesObject.PrimaryReplicaServerName = $mockServerObjectDomainInstanceName - $mockAvailabilityGroupWithoutDatabasesObject.AvailabilityReplicas = $mockAvailabilityReplicaObjects - - $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityGroup - $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.AvailabilityDatabases = $mockAvailabilityDatabaseObjects - $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.Name = $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServerName - $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.PrimaryReplicaServerName = $mockPrimaryServerObjectDomainInstanceName - $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.AvailabilityReplicas = $mockAvailabilityReplicaObjects - - #endregion Availability Group Mocks - - #region Certificate Mocks - - [byte[]]$mockThumbprint1 = @( - 83 - 121 - 115 - 116 - 101 - 109 - 46 - 84 - 101 - 120 - 116 - 46 - 85 - 84 - 70 - 56 - 69 - 110 - 99 - 111 - 100 - 105 - 110 - 103 - ) - - [byte[]]$mockThumbprint2 = @( - 83 - 121 - 115 - 23 - 101 - 109 - 46 - 84 - 101 - 120 - 116 - 85 - 85 - 84 - 70 - 56 - 69 - 23 - 99 - 111 - 100 - 105 - 110 - 103 - ) - - $mockCertificateObject1 = New-Object Microsoft.SqlServer.Management.Smo.Certificate - $mockCertificateObject1.Thumbprint = $mockThumbprint1 - - $mockCertificateObject2 = New-Object Microsoft.SqlServer.Management.Smo.Certificate - $mockCertificateObject2.Thumbprint = $mockThumbprint2 - - $mockDatabaseEncryptionKeyObject = New-Object Microsoft.SqlServer.Management.Smo.DatabaseEncryptionKey - $mockDatabaseEncryptionKeyObject.EncryptorName = 'TDE Cert' - $mockDatabaseEncryptionKeyObject.Thumbprint = $mockThumbprint1 - - #endregion Certificate Mocks - - #region Database File Mocks - - $mockDataFilePath = 'E:\SqlData' - $mockLogFilePath = 'F:\SqlLog' - $mockDataFilePathIncorrect = 'G:\SqlData' - $mockLogFilePathIncorrect = 'H:\SqlData' - - #endregion Database File Mocks - - #region Database Mocks - - # The databases found on the instance - $mockPresentDatabaseNames = @( - 'DB1' - 'DB2' - '3rdTypeOfDatabase' - 'UndefinedDatabase' - ) - - $mockMasterDatabaseName = 'master' - $mockMasterDatabaseObject1 = New-Object Microsoft.SqlServer.Management.Smo.Database - $mockMasterDatabaseObject1.Name = $mockMasterDatabaseName - $mockMasterDatabaseObject1.ID = 1 - $mockMasterDatabaseObject1.Certificates = @($mockCertificateObject1) - $mockMasterDatabaseObject1.FileGroups = @{ - Name = 'PRIMARY' - Files = @{ - FileName = ( [IO.Path]::Combine( $mockDataFilePath, "$($mockMasterDatabaseName).mdf" ) ) - } - } - $mockMasterDatabaseObject1.LogFiles = @{ - FileName = ( [IO.Path]::Combine( $mockLogFilePath, "$($mockMasterDatabaseName).ldf" ) ) - } - - $mockDatabaseObjects = New-Object Microsoft.SqlServer.Management.Smo.DatabaseCollection - foreach ( $mockPresentDatabaseName in $mockPresentDatabaseNames ) - { - $newDatabaseObject = New-Object Microsoft.SqlServer.Management.Smo.Database - $newDatabaseObject.Name = $mockPresentDatabaseName - $newDatabaseObject.FileGroups = @{ - Name = 'PRIMARY' - Files = @{ - FileName = ( [IO.Path]::Combine( $mockDataFilePath, "$($mockPresentDatabaseName).mdf" ) ) - } - } - $newDatabaseObject.LogFiles = @{ - FileName = ( [IO.Path]::Combine( $mockLogFilePath, "$($mockPresentDatabaseName).ldf" ) ) - } - - # Add the database object to the database collection - $mockDatabaseObjects.Add($newDatabaseObject) - } - $mockDatabaseObjects.Add($mockMasterDatabaseObject1) - - $mockDatabaseObjectsWithIncorrectFileNames = New-Object Microsoft.SqlServer.Management.Smo.DatabaseCollection - foreach ( $mockPresentDatabaseName in $mockPresentDatabaseNames ) - { - $newDatabaseObject = New-Object Microsoft.SqlServer.Management.Smo.Database - $newDatabaseObject.Name = $mockPresentDatabaseName - $newDatabaseObject.FileGroups = @{ - Name = 'PRIMARY' - Files = @{ - FileName = ( [IO.Path]::Combine( $mockDataFilePathIncorrect, "$($mockPresentDatabaseName).mdf" ) ) - } - } - $newDatabaseObject.LogFiles = @{ - FileName = ( [IO.Path]::Combine( $mockLogFilePathIncorrect, "$($mockPresentDatabaseName).ldf" ) ) - } - - # Add the database object to the database collection - $mockDatabaseObjectsWithIncorrectFileNames.Add($newDatabaseObject) - } - - #endregion Database Mocks - - #region Server mocks - - $mockBadServerObject = New-Object -TypeName Object - - $mockServerObject = New-Object Microsoft.SqlServer.Management.Smo.Server - $mockServerObject.AvailabilityGroups = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityGroupCollection - $mockServerObject.AvailabilityGroups.Add($mockAvailabilityGroupObject.Clone()) - $mockServerObject.AvailabilityGroups.Add($mockAvailabilityGroupWithoutDatabasesObject.Clone()) - $mockServerObject.AvailabilityGroups.Add($mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.Clone()) - $mockServerObject.Databases = $mockDatabaseObjects - $mockServerObject.DomainInstanceName = $mockServerObjectDomainInstanceName - $mockServerObject.NetName = $mockServerObjectDomainInstanceName - $mockServerObject.ServiceName = 'MSSQLSERVER' - $mockServerObject.AvailabilityGroups[$mockAvailabilityGroupObject.Name].LocalReplicaRole = 'Primary' - $mockServerObject.AvailabilityGroups[$mockAvailabilityGroupWithoutDatabasesObject.Name].LocalReplicaRole = 'Primary' - $mockServerObject.AvailabilityGroups[$mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.Name].LocalReplicaRole = 'Secondary' - - $mockServer2Object = New-Object Microsoft.SqlServer.Management.Smo.Server - $mockServer2Object.AvailabilityGroups = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityGroupCollection - $mockServer2Object.AvailabilityGroups.Add($mockAvailabilityGroupObject.Clone()) - $mockServer2Object.AvailabilityGroups.Add($mockAvailabilityGroupWithoutDatabasesObject.Clone()) - $mockServer2Object.AvailabilityGroups.Add($mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.Clone()) - $mockServer2Object.Databases = $mockDatabaseObjects - $mockServer2Object.DomainInstanceName = $mockPrimaryServerObjectDomainInstanceName - $mockServer2Object.NetName = $mockPrimaryServerObjectDomainInstanceName - $mockServer2Object.ServiceName = 'MSSQLSERVER' - $mockServer2Object.AvailabilityGroups[$mockAvailabilityGroupObject.Name].LocalReplicaRole = 'Secondary' - $mockServer2Object.AvailabilityGroups[$mockAvailabilityGroupWithoutDatabasesObject.Name].LocalReplicaRole = 'Secondary' - $mockServer2Object.AvailabilityGroups[$mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.Name].LocalReplicaRole = 'Primary' - - #endregion Server mocks - - #region Invoke Query Mock - - $mockResultInvokeQueryFileExist = { - return @{ - Tables = @{ - Rows = @{ - 'File is a Directory' = 1 - } - } - } - } - - $mockResultInvokeQueryFileNotExist = { - return @{ - Tables = @{ - Rows = @{ - 'File is a Directory' = 0 - } - } - } - } - - $mockInvokeQueryParameterRestoreDatabase = { - $Query -like 'RESTORE DATABASE * -FROM DISK = * -WITH NORECOVERY' - } - - $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs = { - $Query -like 'EXECUTE AS LOGIN = * -RESTORE DATABASE * -FROM DISK = * -WITH NORECOVERY' - } - - #endregion Invoke Query Mock - - Describe 'SqlAGDatabases\Get-TargetResource' { - BeforeAll { - Mock -CommandName Connect-SQL -MockWith { return $mockServerObject } -Verifiable - Mock -CommandName Import-SQLPSModule -MockWith {} -Verifiable - } - - BeforeEach { - $getTargetResourceParameters = @{ - DatabaseName = $mockDatabaseNameParameter.Clone() - SqlServer = 'Server1' - SQLInstanceName = 'MSSQLSERVER' - AvailabilityGroupName = 'AvailabilityGroup1' - BackupPath = $($mockBackupPath) - } - } - - Context 'When the Get-TargetResource function is called' { - It 'Should not return an availability group name or availability databases when the availability group does not exist' { - $getTargetResourceParameters.AvailabilityGroupName = 'NonExistentAvailabilityGroup' - - $result = Get-TargetResource @getTargetResourceParameters - - $result.SqlServer | Should -Be $getTargetResourceParameters.SqlServer - $result.SQLInstanceName | Should -Be $getTargetResourceParameters.SQLInstanceName - $result.AvailabilityGroupName | Should -BeNullOrEmpty - $result.DatabaseName | Should -BeNullOrEmpty - - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 0 -Exactly - } - - It 'Should not return any databases if there are no databases in the availability group' { - $getTargetResourceParameters.AvailabilityGroupName = $mockAvailabilityGroupWithoutDatabasesObject.Name - - $result = Get-TargetResource @getTargetResourceParameters - - $result.SqlServer | Should -Be $getTargetResourceParameters.SqlServer - $result.SQLInstanceName | Should -Be $getTargetResourceParameters.SQLInstanceName - $result.AvailabilityGroupName | Should -Be $mockAvailabilityGroupWithoutDatabasesObject.Name - $result.DatabaseName | Should -BeNullOrEmpty - - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 0 -Exactly - } - - It 'Should return databases when there are databases in the availability group' { - $result = Get-TargetResource @getTargetResourceParameters - - $result.SqlServer | Should -Be $getTargetResourceParameters.SqlServer - $result.SQLInstanceName | Should -Be $getTargetResourceParameters.SQLInstanceName - $result.AvailabilityGroupName | Should -Be $mockAvailabilityGroupObject.Name - - foreach ( $resultDatabaseName in $result.DatabaseName ) - { - $mockAvailabilityDatabaseNames -contains $resultDatabaseName | Should -Be $true - } - - foreach ( $mockAvailabilityDatabaseName in $mockAvailabilityDatabaseNames ) - { - $result.DatabaseName -contains $mockAvailabilityDatabaseName | Should -Be $true - } - - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 0 -Exactly - } - } - } - - Describe 'SqlAGDatabases\Set-TargetResource' { - BeforeAll { - Mock -CommandName Get-PrimaryReplicaServerObject -MockWith { return $mockServerObject } -Verifiable -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Mock -CommandName Get-PrimaryReplicaServerObject -MockWith { return $mockServer2Object } -Verifiable -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Mock -CommandName Import-SQLPSModule -MockWith {} -Verifiable - Mock -CommandName Invoke-Query -MockWith {} -Verifiable -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Mock -CommandName Invoke-Query -MockWith {} -Verifiable -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Mock -CommandName Join-Path -MockWith { [IO.Path]::Combine($databaseMembershipClass.BackupPath,"$($database.Name)_Full_$(Get-Date -Format 'yyyyMMddhhmmss').bak") } -Verifiable -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Mock -CommandName Join-Path -MockWith { [IO.Path]::Combine($databaseMembershipClass.BackupPath,"$($database.Name)_Log_$(Get-Date -Format 'yyyyMMddhhmmss').trn") } -Verifiable -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Mock -CommandName New-TerminatingError { $ErrorType } -Verifiable - Mock -CommandName Remove-Item -MockWith {} -Verifiable - Mock -CommandName Restore-SqlDatabase -MockWith {} -Verifiable - } - - BeforeEach { - $mockSetTargetResourceParameters = @{ - DatabaseName = $($mockDatabaseNameParameter) - SQLServer = $($mockServerObject.DomainInstanceName) - SQLInstanceName = $('MSSQLSERVER') - AvailabilityGroupName = $($mockAvailabilityGroupObjectName) - BackupPath = $($mockBackupPath) - Ensure = 'Present' - Force = $false - MatchDatabaseOwner = $true - } - - Mock -CommandName Add-SqlAvailabilityDatabase -MockWith {} -Verifiable -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Mock -CommandName Add-SqlAvailabilityDatabase -MockWith {} -Verifiable -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Mock -CommandName Add-SqlAvailabilityDatabase -MockWith {} -Verifiable -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Mock -CommandName Add-SqlAvailabilityDatabase -MockWith {} -Verifiable -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Mock -CommandName Backup-SqlDatabase -MockWith {} -Verifiable -ParameterFilter { $BackupAction -eq 'Database' } - Mock -CommandName Backup-SqlDatabase -MockWith {} -Verifiable -ParameterFilter { $BackupAction -eq 'Log'} - Mock -CommandName Connect-SQL -MockWith { return $mockServerObject } -Verifiable -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Mock -CommandName Connect-SQL -MockWith { return $mockServerObject } -Verifiable -ParameterFilter { $SqlServer -eq 'Server1' } - Mock -CommandName Connect-SQL -MockWith { return $mockServer2Object } -Verifiable -ParameterFilter { $SqlServer -eq 'Server2' } - Mock -CommandName Invoke-Query -MockWith $mockResultInvokeQueryFileExist -Verifiable -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Mock -CommandName Remove-SqlAvailabilityDatabase -MockWith {} -Verifiable - Mock -CommandName Test-ImpersonatePermissions -MockWith { $true } -Verifiable - } - - Context 'When Ensure is Present' { - It 'Should add the specified databases to the availability group' { - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Not -Throw - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 3 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 1 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly - } - - It 'Should add the specified databases to the availability group when the primary replica is on another server' { - $mockSetTargetResourceParameters.AvailabilityGroupName = $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServerName - - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Not -Throw - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 3 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 1 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly - } - - It 'Should not do anything if no databases were found to add' { - $mockSetTargetResourceParameters.DatabaseName = $mockAvailabilityDatabaseNames - - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Not -Throw - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 0 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 0 -Exactly - } - - It 'Should add the specified databases to the availability group when "MatchDatabaseOwner" is $false' { - $mockSetTargetResourceParameters.MatchDatabaseOwner = $false - - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Not -Throw - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 1 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 0 -Exactly - } - - It 'Should throw the correct error when "MatchDatabaseOwner" is $true and the current login does not have impersonate permissions' { - Mock -CommandName Test-ImpersonatePermissions -MockWith { $false } -Verifiable - - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw "The login '$([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)' is missing impersonate permissions in the instances 'Server2'." - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly - } - - $prerequisiteChecks = @{ - RecoveryModel = 'Full' - ReadOnly = $false - UserAccess = 'Multiple' - AutoClose = $false - AvailabilityGroupName = '' - IsMirroringEnabled = $false - } - - foreach ( $prerequisiteCheck in $prerequisiteChecks.GetEnumerator() ) - { - It "Should throw the correct error when the database property '$($prerequisiteCheck.Key)' is not '$($prerequisiteCheck.Value)'" { - $originalValue = $mockServerObject.Databases['DB1'].($prerequisiteCheck.Key) - $mockServerObject.Databases['DB1'].($prerequisiteCheck.Key) = $true - - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw "The operation on the database 'DB1' failed with the following errors: The following prerequisite checks failed: $($prerequisiteCheck.Key) is not $($prerequisiteCheck.Value)." - - foreach ( $databaseProperty in $prerequisiteChecks.GetEnumerator() ) - { - if ( $prerequisiteCheck.Key -eq $databaseProperty.Key ) - { - $mockServerObject.Databases['DB1'].($databaseProperty.Key) | Should -Not -Be ($databaseProperty.Value) - } - else - { - $mockServerObject.Databases['DB1'].($databaseProperty.Key) | Should -Be ($databaseProperty.Value) - } - } - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly - - $mockServerObject.Databases['DB1'].($prerequisiteCheck.Key) = $originalValue - } - } - - It 'Should throw the correct error when the database property "ID" is less than "4"' { - $mockSetTargetResourceParameters.DatabaseName = @('master') - - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw "The operation on the database 'master' failed with the following errors: The following prerequisite checks failed: The database cannot be a system database." - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly - } - - $filestreamProperties = @{ - DefaultFileStreamFileGroup = '' - FilestreamDirectoryName = '' - FilestreamNonTransactedAccess = 'Off' - } - - foreach ( $filestreamProperty in $filestreamProperties.GetEnumerator() ) - { - It "Should throw the correct error 'AlterAvailabilityGroupDatabaseMembershipFailure' when the database property '$($filestreamProperty.Key)' is not '$($filestreamProperty.Value)'" { - $originalValue = $mockServerObject.Databases['DB1'].($filestreamProperty.Key) - $mockServerObject.Databases['DB1'].($filestreamProperty.Key) = 'On' - - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw "The operation on the database 'DB1' failed with the following errors: The following prerequisite checks failed: Filestream is disabled on the following instances: Server2" - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 3 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly - - $mockServerObject.Databases['DB1'].($filestreamProperty.Key) = $originalValue - } - } - - It 'Should throw the correct error when the database property "ContainmentType" is not "Partial"' { - $originalValue = $mockServerObject.Databases['DB1'].ContainmentType - $mockServerObject.Databases['DB1'].ContainmentType = 'Partial' - - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw "The operation on the database 'DB1' failed with the following errors: The following prerequisite checks failed: Contained Database Authentication is not enabled on the following instances: " - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 3 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly - - $mockServerObject.Databases['DB1'].ContainmentType = $originalValue - } - - It 'Should throw the correct error when the database file path does not exist on the secondary replica' { - Mock -CommandName Invoke-Query -MockWith $mockResultInvokeQueryFileNotExist -Verifiable -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - $originalValue = $mockServer2Object.Databases['DB1'].FileGroups.Files.FileName - $mockServer2Object.Databases['DB1'].FileGroups.Files.FileName = ( [IO.Path]::Combine( 'X:\', "DB1.mdf" ) ) - - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw "The operation on the database 'DB1' failed with the following errors: The following prerequisite checks failed: The instance 'Server2' is missing the following directories: X:\, F:\SqlLog" - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly - - $mockServer2Object.Databases['DB1'].FileGroups.Files.FileName = $originalValue - } - - It 'Should throw the correct error when the log file path does not exist on the secondary replica' { - Mock -CommandName Invoke-Query -MockWith $mockResultInvokeQueryFileNotExist -Verifiable -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - $originalValue = $mockServer2Object.Databases['DB1'].LogFiles.FileName - $mockServer2Object.Databases['DB1'].LogFiles.FileName = ( [IO.Path]::Combine( 'Y:\', "DB1.ldf" ) ) - - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw 'The operation on the database ''DB1'' failed with the following errors: The following prerequisite checks failed: The instance ''Server2'' is missing the following directories: E:\SqlData, Y:\' - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly - - $mockServer2Object.Databases['DB1'].LogFiles.FileName = $originalValue - } - - It 'Should throw the correct error when TDE is enabled on the database but the certificate is not present on the replica instances' { - $mockServerObject.Databases['DB1'].EncryptionEnabled = $true - $mockServerObject.Databases['DB1'].DatabaseEncryptionKey = $mockDatabaseEncryptionKeyObject - $mockServer2Object.Databases['master'].Certificates = @($mockCertificateObject2) - - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw 'The operation on the database ''DB1'' failed with the following errors: The following prerequisite checks failed: The instance ''Server2'' is missing the following certificates: TDE Cert' - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 3 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly - - $mockServerObject.Databases['DB1'].EncryptionEnabled = $false - $mockServerObject.Databases['DB1'].DatabaseEncryptionKey = $null - $mockServer2Object.Databases['master'].Certificates = @($mockCertificateObject1) - } - - It 'Should add the specified databases to the availability group when the database has not been previously backed up' { - $mockServerObject.Databases['DB1'].LastBackupDate = 0 - - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Not -Throw - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 3 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 1 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly - } - - It 'Should throw the correct error when it fails to perform a full backup' { - Mock -CommandName Backup-SqlDatabase -MockWith { throw } -Verifiable -ParameterFilter { $BackupAction -eq 'Database' } - - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw 'The operation on the database ''DB1'' failed with the following errors: System.Management.Automation.RuntimeException: ScriptHalted' - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly - } - - It 'Should throw the correct error when it fails to perform a log backup' { - Mock -CommandName Backup-SqlDatabase -MockWith { throw } -Verifiable -ParameterFilter { $BackupAction -eq 'Log' } - - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw 'The operation on the database ''DB1'' failed with the following errors: System.Management.Automation.RuntimeException: ScriptHalted' - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly - } - - It 'Should throw the correct error when it fails to add the database to the primary replica' { - Mock -CommandName Add-SqlAvailabilityDatabase -MockWith { throw } -Verifiable -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw 'The operation on the database ''DB1'' failed with the following errors: System.Management.Automation.RuntimeException: ScriptHalted' - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly - } - - It 'Should throw the correct error when it fails to add the database to the primary replica' { - Mock -CommandName Add-SqlAvailabilityDatabase -MockWith { throw } -Verifiable -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw 'The operation on the database ''DB1'' failed with the following errors: System.Management.Automation.RuntimeException: ScriptHalted' - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 3 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 1 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly - } - } - - Context 'When Ensure is Absent' { - BeforeEach { - $mockSetTargetResourceParameters.Ensure = 'Absent' - } - - It 'Should remove the specified databases to the availability group(s)' { - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Not -Throw - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 0 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 2 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 0 -Exactly - } - - It 'Should remove the specified databases to the availability group(s) when the primary replica is on another server' { - $mockSetTargetResourceParameters.AvailabilityGroupName = $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServerName - - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Not -Throw - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 0 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 2 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 0 -Exactly - } - - It 'Should throw the correct error when it fails to remove the database from the availability group' { - Mock -CommandName Remove-SqlAvailabilityDatabase -MockWith { throw } -Verifiable - - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Throw 'The operation on the database ''DB2'' failed with the following errors: Failed to remove the database from the availability group.' - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 0 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 0 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 2 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 0 -Exactly - } - } - - Context 'When Ensure is Present and Force is True' { - BeforeEach { - $mockSetTargetResourceParameters.Ensure = 'Present' - $mockSetTargetResourceParameters.Force = $true - } - - It 'Should ensure the database membership of the availability group is exactly as specified' { - { Set-TargetResource @mockSetTargetResourceParameters } | Should -Not -Throw - - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server1' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Primary' } - Assert-MockCalled -CommandName Add-SqlAvailabilityDatabase -Scope It -Times 0 -Exactly -ParameterFilter { $InputObject.PrimaryReplicaServerName -eq 'Server2' -and $InputObject.LocalReplicaRole -eq 'Secondary' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Database' } - Assert-MockCalled -CommandName Backup-SqlDatabase -Scope It -Times 1 -Exactly -ParameterFilter { $BackupAction -eq 'Log' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' -and $SQLInstanceName -eq 'MSSQLSERVER' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly -ParameterFilter { $SqlServer -eq 'Server1' } - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 3 -Exactly -ParameterFilter { $SqlServer -eq 'Server2' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Import-SQLPSModule -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 2 -Exactly -ParameterFilter { $Query -like 'EXEC master.dbo.xp_fileexist *' } - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 0 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabase - Assert-MockCalled -CommandName Invoke-Query -Scope It -Times 1 -Exactly -ParameterFilter $mockInvokeQueryParameterRestoreDatabaseWithExecuteAs - Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Full_*.bak' } - Assert-MockCalled -CommandName Join-Path -Scope It -Times 1 -Exactly -ParameterFilter { $ChildPath -like '*_Log_*.trn' } - Assert-MockCalled -CommandName New-TerminatingError -Scope It -Times 0 -Exactly - Assert-MockCalled -CommandName Remove-Item -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Remove-SqlAvailabilityDatabase -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Restore-SqlDatabase -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Test-ImpersonatePermissions -Scope It -Times 1 -Exactly - } - } - } - - Describe 'SqlAGDatabases\Test-TargetResource' { - BeforeAll { - Mock -CommandName Connect-SQL -MockWith { return $mockServerObject } -Verifiable - Mock -CommandName Get-PrimaryReplicaServerObject -MockWith { return $mockServerObject } -Verifiable -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Mock -CommandName Get-PrimaryReplicaServerObject -MockWith { return $mockServer2Object } -Verifiable -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Mock -CommandName Test-ActiveNode -MockWith { - return -not $mockProcessOnlyOnActiveNode - } -Verifiable - } - - BeforeEach { - $mockTestTargetResourceParameters = @{ - DatabaseName = $mockDatabaseNameParameter.Clone() - SqlServer = $mockServerObject.DomainInstanceName - SQLInstanceName = 'MSSQLSERVER' - AvailabilityGroupName = $mockAvailabilityGroupObject.Name - BackupPath = $($mockBackupPath) - Ensure = 'Present' - Force = $false - MatchDatabaseOwner = $false - ProcessOnlyOnActiveNode = $false - } - } - - Context 'When Ensure is Present' { - It 'Should return $true when the configuration is in the desired state' { - $mockTestTargetResourceParameters.DatabaseName = $mockAvailabilityDatabaseNames.Clone() - - Test-TargetResource @mockTestTargetResourceParameters | Should -Be $true - - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Test-ActiveNode -Scope It -Times 1 -Exactly - } - - It 'Should return $false when the specified availability group is not found' { - $mockTestTargetResourceParameters.AvailabilityGroupName = 'NonExistentAvailabilityGroup' - - Test-TargetResource @mockTestTargetResourceParameters | Should -Be $false - - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Test-ActiveNode -Scope It -Times 1 -Exactly - } - - It 'Should return $false when no matching databases are found' { - $mockTestTargetResourceParameters.DatabaseName = $mockDatabaseNameParameterWithNonExistingDatabases.Clone() - - Test-TargetResource @mockTestTargetResourceParameters | Should -Be $false - - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Test-ActiveNode -Scope It -Times 1 -Exactly - } - - It 'Should return $false when databases are found to add to the availability group' { - Test-TargetResource @mockTestTargetResourceParameters | Should -Be $false - - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Test-ActiveNode -Scope It -Times 1 -Exactly - } - - It 'Should return $true when the configuration is in the desired state and the primary replica is on another server' { - $mockTestTargetResourceParameters.DatabaseName = $mockAvailabilityDatabaseNames.Clone() - $mockTestTargetResourceParameters.AvailabilityGroupName = $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.Name - - Test-TargetResource @mockTestTargetResourceParameters | Should -Be $true - - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Test-ActiveNode -Scope It -Times 1 -Exactly - } - - It 'Should return $true when ProcessOnlyOnActiveNode is "$true" and the current node is not actively hosting the instance' { - $mockProcessOnlyOnActiveNode = $true - - $mockTestTargetResourceParameters.DatabaseName = $mockAvailabilityDatabaseNames.Clone() - $mockTestTargetResourceParameters.ProcessOnlyOnActiveNode = $mockProcessOnlyOnActiveNode - - Test-TargetResource @mockTestTargetResourceParameters | Should -Be $true - - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 1 -Exactly - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - Assert-MockCalled -CommandName Test-ActiveNode -Scope It -Times 1 -Exactly - } - } - - Context 'When Ensure is Absent' { - BeforeEach { - $mockTestTargetResourceParameters.Ensure = 'Absent' - } - - It 'Should return $true when the configuration is in the desired state' { - $mockTestTargetResourceParameters.DatabaseName = $mockDatabaseNameParameterWithNonExistingDatabases.Clone() - - Test-TargetResource @mockTestTargetResourceParameters | Should -Be $true - - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - - } - - It 'Should return $true when no matching databases are found' { - $mockTestTargetResourceParameters.DatabaseName = $mockDatabaseNameParameterWithNonExistingDatabases.Clone() - - Test-TargetResource @mockTestTargetResourceParameters | Should -Be $true - - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - } - - It 'Should return $false when databases are found to remove from the availability group' { - Test-TargetResource @mockTestTargetResourceParameters | Should -Be $false - - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - } - - It 'Should return $true when the configuration is in the desired state and the primary replica is on another server' { - $mockTestTargetResourceParameters.DatabaseName = $mockDatabaseNameParameterWithNonExistingDatabases.Clone() - $mockTestTargetResourceParameters.AvailabilityGroupName = $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.Name - - Test-TargetResource @mockTestTargetResourceParameters | Should -Be $true - - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - } - } - - Context 'When Ensure is Present and Force is True' { - BeforeEach { - $mockTestTargetResourceParameters.Force = $true - } - - It 'Should return $true when the configuration is in the desired state' { - $mockTestTargetResourceParameters.DatabaseName = $mockAvailabilityDatabaseNames.Clone() - - Test-TargetResource @mockTestTargetResourceParameters | Should -Be $true - - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - } - - It 'Should return $false when no matching databases are found' { - $mockTestTargetResourceParameters.DatabaseName = $mockDatabaseNameParameterWithNonExistingDatabases.Clone() - - Test-TargetResource @mockTestTargetResourceParameters | Should -Be $false - - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - } - - It 'Should return $false when databases are found to add to the availability group' { - Test-TargetResource @mockTestTargetResourceParameters | Should -Be $false - - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - } - - It 'Should return $false when databases are found to remove from the availability group' { - Test-TargetResource @mockTestTargetResourceParameters | Should -Be $false - - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - } - - It 'Should return $true when the configuration is in the desired state and the primary replica is on another server' { - $mockTestTargetResourceParameters.DatabaseName = $mockAvailabilityDatabaseNames.Clone() - $mockTestTargetResourceParameters.AvailabilityGroupName = $mockAvailabilityGroupObjectWithPrimaryReplicaOnAnotherServer.Name - - Test-TargetResource @mockTestTargetResourceParameters | Should -Be $true - - Assert-MockCalled -CommandName Connect-SQL -Scope It -Times 2 -Exactly - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 0 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } - Assert-MockCalled -CommandName Get-PrimaryReplicaServerObject -Scope It -Times 1 -Exactly -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } - } - } - } - - Describe 'SqlAGDatabases\Get-DatabasesToAddToAvailabilityGroup' { - BeforeEach { - $getDatabasesToAddToAvailabilityGroup = @{ - DatabaseName = $mockDatabaseNameParameter.Clone() - Ensure = 'Present' - ServerObject = $mockServerObject - AvailabilityGroup = $mockAvailabilityGroupObject - } - } - - Context 'When Ensure is Present' { - It 'Should return an array of database names to add when matches are found' { - $results = Get-DatabasesToAddToAvailabilityGroup @getDatabasesToAddToAvailabilityGroup - - foreach ( $result in $results ) - { - $mockAvailabilityDatabasePresentResults -contains $result | Should -Be $true - } - } - - It 'Should return an array of database names no databases are in the availability group' { - $getDatabasesToAddToAvailabilityGroup.AvailabilityGroup = $mockAvailabilityGroupWithoutDatabasesObject - - $results = Get-DatabasesToAddToAvailabilityGroup @getDatabasesToAddToAvailabilityGroup - - foreach ( $result in $results ) - { - $mockPresentDatabaseNames -contains $result | Should -Be $true - } - } - - It 'Should return an empty object when no matches are found' { - $getDatabasesToAddToAvailabilityGroup.DatabaseName = @() - - Get-DatabasesToAddToAvailabilityGroup @getDatabasesToAddToAvailabilityGroup | Should -BeNullOrEmpty - } - } - } - - Describe 'SqlAGDatabases\Get-DatabasesToRemoveFromAvailabilityGroup' { - BeforeEach { - $getDatabasesToRemoveFromAvailabilityGroupParameters = @{ - DatabaseName = $mockDatabaseNameParameter.Clone() - Ensure = 'Present' - Force = $false - ServerObject = $mockServerObject - AvailabilityGroup = $mockAvailabilityGroupObject - } - } - - Context 'When Ensure is Absent' { - BeforeEach { - $getDatabasesToRemoveFromAvailabilityGroupParameters.Ensure = 'Absent' - } - - It 'Should return an array of database names to remove when matches are found' { - $results = Get-DatabasesToRemoveFromAvailabilityGroup @getDatabasesToRemoveFromAvailabilityGroupParameters - - foreach ( $result in $results ) - { - $mockAvailabilityDatabaseAbsentResults -contains $result | Should -Be $true - } - } - - It 'Should return an array of database names to remove when no databases are in the availability group' { - $getDatabasesToRemoveFromAvailabilityGroupParameters.AvailabilityGroup = $mockAvailabilityGroupWithoutDatabasesObject - - $results = Get-DatabasesToRemoveFromAvailabilityGroup @getDatabasesToRemoveFromAvailabilityGroupParameters - - foreach ( $result in $results ) - { - $mockAvailabilityDatabaseAbsentResults -contains $result | Should -Be $true - } - } - - It 'Should return an empty object when no matches are found' { - $getDatabasesToRemoveFromAvailabilityGroupParameters.DatabaseName = @() - - Get-DatabasesToRemoveFromAvailabilityGroup @getDatabasesToRemoveFromAvailabilityGroupParameters | Should -BeNullOrEmpty - } - } - - Context 'When Ensure is Present and Force is True' { - BeforeEach { - $getDatabasesToRemoveFromAvailabilityGroupParameters.Force = $true - } - - It 'Should return an array of database names to remove when matches are found' { - $results = Get-DatabasesToRemoveFromAvailabilityGroup @getDatabasesToRemoveFromAvailabilityGroupParameters - - foreach ( $result in $results ) - { - $mockAvailabilityDatabaseExactlyRemoveResults -contains $result | Should -Be $true - } - } - - It 'Should return all of the databases in the availability group if no matches were found' { - $getDatabasesToRemoveFromAvailabilityGroupParameters.DatabaseName = @() - - $results = Get-DatabasesToRemoveFromAvailabilityGroup @getDatabasesToRemoveFromAvailabilityGroupParameters - - # Ensure all of the results are in the Availability Databases - foreach ( $result in $results ) - { - $mockAvailabilityDatabaseNames -contains $result | Should -Be $true - } - - # Ensure all of the Availability Databases are in the results - foreach ( $mockAvailabilityDatabaseName in $mockAvailabilityDatabaseNames ) - { - $results -contains $mockAvailabilityDatabaseName | Should -Be $true - } - } - } - } - - Describe 'SqlAGDatabases\Get-MatchingDatabaseNames' { - BeforeEach { - $getMatchingDatabaseNamesParameters = @{ - DatabaseName = $mockDatabaseNameParameter.Clone() - ServerObject = $mockServerObject - } - } - - Context 'When the Get-MatchingDatabaseNames function is called' { - It 'Should throw the correct error when and invalid object type is passed to the method' { - $getMatchingDatabaseNamesParameters.ServerObject = $mockBadServerObject - - { Get-MatchingDatabaseNames @getMatchingDatabaseNamesParameters } | Should -Throw 'ServerObject' - } - - It 'Should return an empty object when no matching databases are found' { - $getMatchingDatabaseNamesParameters.DatabaseName = @('DatabaseNotHere') - - Get-MatchingDatabaseNames @getMatchingDatabaseNamesParameters | Should -BeNullOrEmpty - } - - It 'Should return an array of database names that match the defined databases' { - $results = Get-MatchingDatabaseNames @getMatchingDatabaseNamesParameters - - foreach ( $result in $results ) - { - $mockPresentDatabaseNames -contains $result | Should -Be $true - } - } - } - } - - Describe 'SqlAGDatabases\Get-DatabaseNamesNotFoundOnTheInstance' { - Context 'When the Get-DatabaseNamesNotFoundOnTheInstance function is called' { - BeforeAll { - # The defined databases that should be identified as missing - $mockMissingDatabases = @( - 'AnotherDB' - '4th*OfDatabase' - ) - } - - BeforeEach { - $getDatabaseNamesNotFoundOnTheInstanceParameters = @{ - DatabaseName = $mockDatabaseNameParameter.Clone() - MatchingDatabaseNames = @() - } - } - - It 'Should return an empty object when no missing databases were identified' { - $getDatabaseNamesNotFoundOnTheInstanceParameters.MatchingDatabaseNames = $mockDatabaseNameParameter - - Get-DatabaseNamesNotFoundOnTheInstance @getDatabaseNamesNotFoundOnTheInstanceParameters | Should -BeNullOrEmpty - } - - It 'Should return a string array of database names when missing databases are identified' { - $getDatabaseNamesNotFoundOnTheInstanceParameters.MatchingDatabaseNames = $mockPresentDatabaseNames - - $results = Get-DatabaseNamesNotFoundOnTheInstance @getDatabaseNamesNotFoundOnTheInstanceParameters - - foreach ( $result in $results ) - { - $mockMissingDatabases -contains $result | Should -Be $true - } - } - - It 'Should return an empty object is supplied and no databases are defined' { - $getDatabaseNamesNotFoundOnTheInstanceParameters.DatabaseName = @() - $getDatabaseNamesNotFoundOnTheInstanceParameters.MatchingDatabaseNames = $mockPresentDatabaseNames - - Get-DatabaseNamesNotFoundOnTheInstance @getDatabaseNamesNotFoundOnTheInstanceParameters | Should -BeNullOrEmpty - } - } - } - } -} -finally -{ - Invoke-TestCleanup - -} From 67387fcde3287931f165e5bf5f6ddedfc758dff8 Mon Sep 17 00:00:00 2001 From: Johan Ljunggren Date: Fri, 17 Nov 2017 16:59:28 +0100 Subject: [PATCH 37/42] Fix CHANGELOG.md after release --- CHANGELOG.md | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56269e0e5..1bf7713f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,18 +9,15 @@ ## 9.0.0.0 -- Significant rename to reduce length of Resource names - - BREAKING CHANGE - - Impact to all resources -- Changes to SqlServerDsc +- Changes to xSQLServer - Updated Pester syntax to v4 - Fixes broken links to issues in the CHANGELOG.md. -- Changes to SqlDatabase +- Changes to xSQLServerDatabase - Added parameter to specify collation for a database to be different from server collation ([issue #767](https://github.com/PowerShell/xSQLServer/issues/767)). - Fixed unit tests for Get-TargetResource to ensure correctly testing return values ([issue #849](https://github.com/PowerShell/xSQLServer/issues/849)) -- Changes to SqlAG +- Changes to xSQLServerAlwaysOnAvailabilityGroup - Refactored the unit tests to allow them to be more user friendly and to test additional SQLServer variations. - Each test will utilize the Import-SQLModuleStub to ensure the correct @@ -33,22 +30,22 @@ - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, the resource will only determine if a change is needed if the target node is the active host of the SQL Server instance ([issue #868](https://github.com/PowerShell/xSQLServer/issues/868)). -- Changes to SqlAGDatabase +- Changes to xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, the resource will only determine if a change is needed if the target node is the active host of the SQL Server instance ([issue #869](https://github.com/PowerShell/xSQLServer/issues/869)). -- Changes to SqlAGReplica +- Changes to xSQLServerAlwaysOnAvailabilityGroupReplica - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, the resource will only determine if a change is needed if the target node is the active host of the SQL Server instance ([issue #870](https://github.com/PowerShell/xSQLServer/issues/870)). - Added the CommonTestHelper.psm1 to store common testing functions. - Added the Import-SQLModuleStub function to ensure the correct version of the module stubs are loaded ([issue #784](https://github.com/PowerShell/xSQLServer/issues/784)). -- Changes to SqlServerMemory +- Changes to xSQLServerMemory - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, the resource will only determine if a change is needed if the target node is the active host of the SQL Server instance ([issue #867](https://github.com/PowerShell/xSQLServer/issues/867)). -- Changes to SqlServerNetwork +- Changes to xSQLServerNetwork - BREAKING CHANGE: Renamed parameter TcpDynamicPorts to TcpDynamicPort and changed type to Boolean ([issue #534](https://github.com/PowerShell/xSQLServer/issues/534)). - Resolved issue when switching from dynamic to static port. @@ -56,15 +53,15 @@ - Added localization (en-US) for all strings in resource and unit tests ([issue #618](https://github.com/PowerShell/xSQLServer/issues/618)). - Updated examples to reflect new parameters. -- Changes to SqlRS +- Changes to xSQLServerRSConfig - Added examples - Added resource - - SqlDatabaseDefaultLocation + - xSQLServerDatabaseDefaultLocation ([issue #656](https://github.com/PowerShell/xSQLServer/issues/656)) -- Changes to SqlServerEndpointPermission +- Changes to xSQLServerEndpointPermission - Fixed a problem when running the tests locally in a PowerShell console it would ask for parameters ([issue #897](https://github.com/PowerShell/xSQLServer/issues/897)). -- Changes to SqlAGListener +- Changes to xSQLServerAvailabilityGroupListener - Fixed a problem when running the tests locally in a PowerShell console it would ask for parameters ([issue #897](https://github.com/PowerShell/xSQLServer/issues/897)). - Changes to xSQLServerMaxDop From 4d5805be37872c6352a11c0dc9e845f04b87975f Mon Sep 17 00:00:00 2001 From: Johan Ljunggren Date: Fri, 17 Nov 2017 16:59:42 +0100 Subject: [PATCH 38/42] Fix duplicate code in SqlServerMaxDop --- .../MSFT_SqlServerMaxDop.psm1 | 295 ------------------ 1 file changed, 295 deletions(-) diff --git a/DSCResources/MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.psm1 b/DSCResources/MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.psm1 index d69dbb3ee..e43239203 100644 --- a/DSCResources/MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.psm1 +++ b/DSCResources/MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.psm1 @@ -323,298 +323,3 @@ function Get-SqlDscDynamicMaxDop } Export-ModuleMember -Function *-TargetResource -Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDscHelper.psm1') ` - -Force -<# - .SYNOPSIS - This function gets the max degree of parallelism server configuration option. - - .PARAMETER SQLServer - The host name of the SQL Server to be configured. - - .PARAMETER SQLInstanceName - The name of the SQL instance to be configured. -#> -function Get-TargetResource -{ - [CmdletBinding()] - [OutputType([System.Collections.Hashtable])] - param - ( - [Parameter(Mandatory = $true)] - [ValidateNotNullOrEmpty()] - [System.String] - $SQLInstanceName, - - [Parameter()] - [ValidateNotNullOrEmpty()] - [System.String] - $SQLServer = $env:COMPUTERNAME - ) - - $sqlServerObject = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName - - if ($sqlServerObject) - { - Write-Verbose -Message 'Getting the max degree of parallelism server configuration option' - $currentMaxDop = $sqlServerObject.Configuration.MaxDegreeOfParallelism.ConfigValue - } - - $returnValue = @{ - SQLInstanceName = $SQLInstanceName - SQLServer = $SQLServer - MaxDop = $currentMaxDop - } - - $returnValue -} - -<# - .SYNOPSIS - This function sets the max degree of parallelism server configuration option. - - .PARAMETER SQLServer - The host name of the SQL Server to be configured. - - .PARAMETER SQLInstanceName - The name of the SQL instance to be configured. - - .PARAMETER Ensure - When set to 'Present' then max degree of parallelism will be set to either the value in parameter MaxDop or dynamically configured when parameter DynamicAlloc is set to $true. - When set to 'Absent' max degree of parallelism will be set to 0 which means no limit in number of processors used in parallel plan execution. - - .PARAMETER DynamicAlloc - If set to $true then max degree of parallelism will be dynamically configured. - When this is set parameter is set to $true, the parameter MaxDop must be set to $null or not be configured. - - .PARAMETER MaxDop - A numeric value to limit the number of processors used in parallel plan execution. -#> -function Set-TargetResource -{ - [CmdletBinding()] - param - ( - [Parameter(Mandatory = $true)] - [ValidateNotNullOrEmpty()] - [System.String] - $SQLInstanceName, - - [Parameter()] - [ValidateNotNullOrEmpty()] - [System.String] - $SQLServer = $env:COMPUTERNAME, - - [Parameter()] - [ValidateSet('Present', 'Absent')] - [ValidateNotNullOrEmpty()] - [System.String] - $Ensure = 'Present', - - [Parameter()] - [System.Boolean] - $DynamicAlloc, - - [Parameter()] - [System.Int32] - $MaxDop - ) - - $sqlServerObject = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName - - if ($sqlServerObject) - { - Write-Verbose -Message 'Setting the max degree of parallelism server configuration option' - switch ($Ensure) - { - 'Present' - { - if ($DynamicAlloc) - { - if ($MaxDop) - { - throw New-TerminatingError -ErrorType MaxDopParamMustBeNull ` - -FormatArgs @( $SQLServer, $SQLInstanceName ) ` - -ErrorCategory InvalidArgument - } - - $targetMaxDop = Get-SqlDscDynamicMaxDop -SqlServerObject $sqlServerObject - New-VerboseMessage -Message "Dynamic MaxDop is $targetMaxDop." - } - else - { - $targetMaxDop = $MaxDop - } - } - - 'Absent' - { - $targetMaxDop = 0 - New-VerboseMessage -Message 'Desired state should be absent - MAXDOP is reset to the default value.' - } - } - - try - { - $sqlServerObject.Configuration.MaxDegreeOfParallelism.ConfigValue = $targetMaxDop - $sqlServerObject.Alter() - New-VerboseMessage -Message "Setting MAXDOP value to $targetMaxDop." - } - catch - { - throw New-TerminatingError -ErrorType MaxDopSetError ` - -FormatArgs @($SQLServer, $SQLInstanceName, $targetMaxDop) ` - -ErrorCategory InvalidOperation ` - -InnerException $_.Exception - } - } -} - -<# - .SYNOPSIS - This function tests the max degree of parallelism server configuration option. - - .PARAMETER SQLServer - The host name of the SQL Server to be configured. - - .PARAMETER SQLInstanceName - The name of the SQL instance to be configured. - - .PARAMETER Ensure - When set to 'Present' then max degree of parallelism will be set to either the value in parameter MaxDop or dynamically configured when parameter DynamicAlloc is set to $true. - When set to 'Absent' max degree of parallelism will be set to 0 which means no limit in number of processors used in parallel plan execution. - - .PARAMETER DynamicAlloc - If set to $true then max degree of parallelism will be dynamically configured. - When this is set parameter is set to $true, the parameter MaxDop must be set to $null or not be configured. - - .PARAMETER MaxDop - A numeric value to limit the number of processors used in parallel plan execution. -#> -function Test-TargetResource -{ - [CmdletBinding()] - [OutputType([System.Boolean])] - param - ( - [Parameter(Mandatory = $true)] - [ValidateNotNullOrEmpty()] - [System.String] - $SQLInstanceName, - - [Parameter()] - [ValidateNotNullOrEmpty()] - [System.String] - $SQLServer = $env:COMPUTERNAME, - - [Parameter()] - [ValidateSet('Present', 'Absent')] - [ValidateNotNullOrEmpty()] - [System.String] - $Ensure = 'Present', - - [Parameter()] - [System.Boolean] - $DynamicAlloc, - - [Parameter()] - [System.Int32] - $MaxDop - ) - - Write-Verbose -Message 'Testing the max degree of parallelism server configuration option' - - $parameters = @{ - SQLInstanceName = $SQLInstanceName - SQLServer = $SQLServer - } - - $currentValues = Get-TargetResource @parameters - $getMaxDop = $currentValues.MaxDop - $isMaxDopInDesiredState = $true - - switch ($Ensure) - { - 'Absent' - { - if ($getMaxDop -ne 0) - { - New-VerboseMessage -Message "Current MaxDop is $getMaxDop should be updated to 0" - $isMaxDopInDesiredState = $false - } - } - 'Present' - { - if ($DynamicAlloc) - { - if ($MaxDop) - { - throw New-TerminatingError -ErrorType MaxDopParamMustBeNull ` - -FormatArgs @( $SQLServer, $SQLInstanceName ) ` - -ErrorCategory InvalidArgument - } - - $dynamicMaxDop = Get-SqlDscDynamicMaxDop - New-VerboseMessage -Message "Dynamic MaxDop is $dynamicMaxDop." - - if ($getMaxDop -ne $dynamicMaxDop) - { - New-VerboseMessage -Message "Current MaxDop is $getMaxDop should be updated to $dynamicMaxDop" - $isMaxDopInDesiredState = $false - } - } - else - { - if ($getMaxDop -ne $MaxDop) - { - New-VerboseMessage -Message "Current MaxDop is $getMaxDop should be updated to $MaxDop" - $isMaxDopInDesiredState = $false - } - } - } - } - - $isMaxDopInDesiredState -} - -<# - .SYNOPSIS - This cmdlet is used to return the dynamic max degree of parallelism -#> -function Get-SqlDscDynamicMaxDop -{ - $cimInstanceProc = Get-CimInstance -ClassName Win32_Processor - - # init variables - $numProcs = 0 - $numCores = 0 - - # Loop through returned objects - foreach ($processor in $cimInstanceProc) - { - # increment number of processors - $numProcs += $processor.NumberOfLogicalProcessors - - # increment number of cores - $numCores += $processor.NumberOfCores - } - - - if ($numProcs -eq 1) - { - $dynamicMaxDop = [Math]::Round($numCores / 2, [System.MidpointRounding]::AwayFromZero) - } - elseif ($numCores -ge 8) - { - $dynamicMaxDop = 8 - } - else - { - $dynamicMaxDop = $numCores - } - - $dynamicMaxDop -} - -Export-ModuleMember -Function *-TargetResource From d417085e089652a9600d225004796d9a334c8f69 Mon Sep 17 00:00:00 2001 From: Johan Ljunggren Date: Fri, 17 Nov 2017 18:09:28 +0100 Subject: [PATCH 39/42] Removed unwanted files after rebase --- DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1~HEAD | 769 ------------------ .../MSFT_SqlAGReplica.psm1~HEAD | 709 ---------------- 2 files changed, 1478 deletions(-) delete mode 100644 DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1~HEAD delete mode 100644 DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1~HEAD diff --git a/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1~HEAD b/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1~HEAD deleted file mode 100644 index e5154e69f..000000000 --- a/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1~HEAD +++ /dev/null @@ -1,769 +0,0 @@ -Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDscHelper.psm1') ` - -Force - -<# - .SYNOPSIS - Gets the specified Availability Group. - - .PARAMETER Name - The name of the availability group. - - .PARAMETER SQLServer - Hostname of the SQL Server to be configured. - - .PARAMETER SQLInstanceName - Name of the SQL instance to be configured. -#> -function Get-TargetResource -{ - [CmdletBinding()] - [OutputType([System.Collections.Hashtable])] - param - ( - [Parameter(Mandatory = $true)] - [String] - $Name, - - [Parameter(Mandatory = $true)] - [String] - $SQLServer, - - [Parameter(Mandatory = $true)] - [String] - $SQLInstanceName - ) - - # Connect to the instance - $serverObject = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName - - # Define current version for check compatibility - $sqlMajorVersion = $serverObject.Version.Major - - # Get the endpoint properties - $endpoint = $serverObject.Endpoints | Where-Object { $_.EndpointType -eq 'DatabaseMirroring' } - if ( $endpoint ) - { - $endpointPort = $endpoint.Protocol.Tcp.ListenerPort - } - - # Get the Availability Group - $availabilityGroup = $serverObject.AvailabilityGroups[$Name] - - # Is this node actively hosting the SQL instance? - $isActiveNode = Test-ActiveNode -ServerObject $serverObject - - # Create the return object. Default ensure to Absent. - $alwaysOnAvailabilityGroupResource = @{ - Name = $Name - SQLServer = $SQLServer - SQLInstanceName = $SQLInstanceName - Ensure = 'Absent' - IsActiveNode = $isActiveNode - } - - if ( $availabilityGroup ) - { - # Get all of the properties that can be set using this resource - $alwaysOnAvailabilityGroupResource.Ensure = 'Present' - $alwaysOnAvailabilityGroupResource.AutomatedBackupPreference = $availabilityGroup.AutomatedBackupPreference - $alwaysOnAvailabilityGroupResource.AvailabilityMode = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].AvailabilityMode - $alwaysOnAvailabilityGroupResource.BackupPriority = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].BackupPriority - $alwaysOnAvailabilityGroupResource.ConnectionModeInPrimaryRole = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].ConnectionModeInPrimaryRole - $alwaysOnAvailabilityGroupResource.ConnectionModeInSecondaryRole = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].ConnectionModeInSecondaryRole - $alwaysOnAvailabilityGroupResource.FailureConditionLevel = $availabilityGroup.FailureConditionLevel - $alwaysOnAvailabilityGroupResource.FailoverMode = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].FailoverMode - $alwaysOnAvailabilityGroupResource.HealthCheckTimeout = $availabilityGroup.HealthCheckTimeout - $alwaysOnAvailabilityGroupResource.EndpointURL = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].EndpointUrl - $alwaysOnAvailabilityGroupResource.EndpointPort = $endpointPort - $alwaysOnAvailabilityGroupResource.SQLServerNetName = $serverObject.NetName - $alwaysOnAvailabilityGroupResource.Version = $sqlMajorVersion - - # Add properties that are only present in SQL 2016 or newer - if ( $sqlMajorVersion -ge 13 ) - { - $alwaysOnAvailabilityGroupResource.Add('BasicAvailabilityGroup', $availabilityGroup.BasicAvailabilityGroup) - $alwaysOnAvailabilityGroupResource.Add('DatabaseHealthTrigger', $availabilityGroup.DatabaseHealthTrigger) - $alwaysOnAvailabilityGroupResource.Add('DtcSupportEnabled', $availabilityGroup.DtcSupportEnabled) - } - } - - return $alwaysOnAvailabilityGroupResource -} - -<# - .SYNOPSIS - Creates or removes the availability group to in accordance with the desired state. - - .PARAMETER Name - The name of the availability group. - - .PARAMETER SQLServer - Hostname of the SQL Server to be configured. - - .PARAMETER SQLInstanceName - Name of the SQL instance to be configured. - - .PARAMETER Ensure - Specifies if the availability group should be present or absent. Default is Present. - - .PARAMETER AutomatedBackupPreference - Specifies the automated backup preference for the availability group. - - .PARAMETER AvailabilityMode - Specifies the replica availability mode. Default is 'AsynchronousCommit'. - - .PARAMETER BackupPriority - Specifies the desired priority of the replicas in performing backups. The acceptable values for this parameter are integers from 0 through 100. Of the set of replicas which are online and available, the replica that has the highest priority performs the backup. Default is 50. - - .PARAMETER BasicAvailabilityGroup - Specifies the type of availability group is Basic. This is only available is SQL Server 2016 and later and is ignored when applied to previous versions. - - .PARAMETER DatabaseHealthTrigger - Specifies if the option Database Level Health Detection is enabled. This is only available is SQL Server 2016 and later and is ignored when applied to previous versions. - - .PARAMETER DtcSupportEnabled - Specifies if the option Database DTC Support is enabled. This is only available is SQL Server 2016 and later and is ignored when applied to previous versions. This can't be altered once the Availability Group is created and is ignored if it is the case. - - .PARAMETER ConnectionModeInPrimaryRole - Specifies how the availability replica handles connections when in the primary role. - - .PARAMETER ConnectionModeInSecondaryRole - Specifies how the availability replica handles connections when in the secondary role. - - .PARAMETER EndpointHostName - Specifies the hostname or IP address of the availability group replica endpoint. Default is the instance network name. - - .PARAMETER FailureConditionLevel - Specifies the automatic failover behavior of the availability group. - - .PARAMETER HealthCheckTimeout - Specifies the length of time, in milliseconds, after which AlwaysOn availability groups declare an unresponsive server to be unhealthy. Default is 30,000. - - .PARAMETER ProcessOnlyOnActiveNode - Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server Instance. - Not used in Set-TargetResource. -#> -function Set-TargetResource -{ - [CmdletBinding()] - Param - ( - [Parameter(Mandatory = $true)] - [String] - $Name, - - [Parameter(Mandatory = $true)] - [String] - $SQLServer, - - [Parameter(Mandatory = $true)] - [String] - $SQLInstanceName, - - [Parameter()] - [ValidateSet('Present', 'Absent')] - [String] - $Ensure = 'Present', - - [Parameter()] - [ValidateSet('Primary', 'SecondaryOnly', 'Secondary', 'None')] - [String] - $AutomatedBackupPreference = 'None', - - [Parameter()] - [ValidateSet('AsynchronousCommit', 'SynchronousCommit')] - [String] - $AvailabilityMode = 'AsynchronousCommit', - - [Parameter()] - [ValidateRange(0, 100)] - [UInt32] - $BackupPriority = 50, - - [Parameter()] - [Boolean] - $BasicAvailabilityGroup, - - [Parameter()] - [Boolean] - $DatabaseHealthTrigger, - - [Parameter()] - [Boolean] - $DtcSupportEnabled, - - [Parameter()] - [ValidateSet('AllowAllConnections', 'AllowReadWriteConnections')] - [String] - $ConnectionModeInPrimaryRole, - - [Parameter()] - [ValidateSet('AllowNoConnections', 'AllowReadIntentConnectionsOnly', 'AllowAllConnections')] - [String] - $ConnectionModeInSecondaryRole, - - [Parameter()] - [String] - $EndpointHostName, - - [Parameter()] - [ValidateSet( - 'OnServerDown', - 'OnServerUnresponsive', - 'OnCriticalServerErrors', - 'OnModerateServerErrors', - 'OnAnyQualifiedFailureCondition' - )] - [String] - $FailureConditionLevel, - - [Parameter()] - [ValidateSet('Automatic', 'Manual')] - [String] - $FailoverMode = 'Manual', - - [Parameter()] - [UInt32] - $HealthCheckTimeout = 30000, - - [Parameter()] - [Boolean] - $ProcessOnlyOnActiveNode - ) - - Import-SQLPSModule - - # Connect to the instance - $serverObject = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName - - # Determine if HADR is enabled on the instance. If not, throw an error - if ( -not $serverObject.IsHadrEnabled ) - { - throw New-TerminatingError -ErrorType HadrNotEnabled -FormatArgs $Ensure, $SQLInstanceName -ErrorCategory NotImplemented - } - - # Define current version for check compatibility - $sqlMajorVersion = $serverObject.Version.Major - - # Get the Availability Group if it exists - $availabilityGroup = $serverObject.AvailabilityGroups[$Name] - - switch ($Ensure) - { - Absent - { - # If the AG exists - if ( $availabilityGroup ) - { - # If the primary replica is currently on this instance - if ( $availabilityGroup.PrimaryReplicaServerName -eq $serverObject.DomainInstanceName ) - { - try - { - Remove-SqlAvailabilityGroup -InputObject $availabilityGroup -ErrorAction Stop - } - catch - { - throw New-TerminatingError -ErrorType RemoveAvailabilityGroupFailed -FormatArgs $availabilityGroup.Name, $SQLInstanceName -ErrorCategory ResourceUnavailable -InnerException $_.Exception - } - } - else - { - throw New-TerminatingError -ErrorType InstanceNotPrimaryReplica -FormatArgs $SQLInstanceName, $availabilityGroup.Name -ErrorCategory ResourceUnavailable - } - } - } - - Present - { - # Ensure the appropriate cluster permissions are present - Test-ClusterPermissions -ServerObject $serverObject - - # Make sure a database mirroring endpoint exists. - $endpoint = $serverObject.Endpoints | Where-Object { $_.EndpointType -eq 'DatabaseMirroring' } - if ( -not $endpoint ) - { - throw New-TerminatingError -ErrorType DatabaseMirroringEndpointNotFound -FormatArgs $SQLServer, $SQLInstanceName -ErrorCategory ObjectNotFound - } - - if ( -not $EndpointHostName ) - { - $EndpointHostName = $serverObject.NetName - } - - # If the availability group does not exist, create it - if ( -not $availabilityGroup ) - { - # Set up the parameters to create the AG Replica - $newReplicaParams = @{ - Name = $serverObject.DomainInstanceName - Version = $sqlMajorVersion - AsTemplate = $true - AvailabilityMode = $AvailabilityMode - EndpointUrl = "TCP://$($EndpointHostName):$($endpoint.Protocol.Tcp.ListenerPort)" - FailoverMode = $FailoverMode - } - - if ( $BackupPriority ) - { - $newReplicaParams.Add('BackupPriority', $BackupPriority) - } - - if ( $ConnectionModeInPrimaryRole ) - { - $newReplicaParams.Add('ConnectionModeInPrimaryRole', $ConnectionModeInPrimaryRole) - } - - if ( $ConnectionModeInSecondaryRole ) - { - $newReplicaParams.Add('ConnectionModeInSecondaryRole', $ConnectionModeInSecondaryRole) - } - - # Create the new replica object - try - { - $primaryReplica = New-SqlAvailabilityReplica @newReplicaParams -ErrorAction Stop - } - catch - { - throw New-TerminatingError -ErrorType CreateAvailabilityGroupReplicaFailed -FormatArgs $newReplicaParams.Name, $SQLInstanceName -ErrorCategory OperationStopped -InnerException $_.Exception - } - - # Set up the parameters for the new availability group - $newAvailabilityGroupParams = @{ - InputObject = $serverObject - Name = $Name - AvailabilityReplica = $primaryReplica - } - - if ( $AutomatedBackupPreference ) - { - $newAvailabilityGroupParams.Add('AutomatedBackupPreference', $AutomatedBackupPreference) - } - - if ( $sqlMajorVersion -ge 13 ) - { - $newAvailabilityGroupParams.Add('BasicAvailabilityGroup', $BasicAvailabilityGroup) - $newAvailabilityGroupParams.Add('DatabaseHealthTrigger', $DatabaseHealthTrigger) - $newAvailabilityGroupParams.Add('DtcSupportEnabled', $DtcSupportEnabled) - } - - if ( $FailureConditionLevel ) - { - $newAvailabilityGroupParams.Add('FailureConditionLevel', $FailureConditionLevel) - } - - if ( $HealthCheckTimeout ) - { - $newAvailabilityGroupParams.Add('HealthCheckTimeout', $HealthCheckTimeout) - } - - # Create the Availability Group - try - { - New-SqlAvailabilityGroup @newAvailabilityGroupParams -ErrorAction Stop - } - catch - { - throw New-TerminatingError -ErrorType CreateAvailabilityGroupFailed -FormatArgs $Name -ErrorCategory OperationStopped -InnerException $_.Exception - } - } - # Otherwise let's check each of the parameters passed and update the Availability Group accordingly - else - { - # Get the parameters that were submitted to the function - [System.Array] $submittedParameters = $PSBoundParameters.Keys - - # Make sure we're communicating with the primary replica - $primaryServerObject = Get-PrimaryReplicaServerObject -ServerObject $serverObject -AvailabilityGroup $availabilityGroup - $availabilityGroup = $primaryServerObject.AvailabilityGroups[$Name] - - if ( ( $submittedParameters -contains 'AutomatedBackupPreference' ) -and ( $AutomatedBackupPreference -ne $availabilityGroup.AutomatedBackupPreference ) ) - { - $availabilityGroup.AutomatedBackupPreference = $AutomatedBackupPreference - Update-AvailabilityGroup -AvailabilityGroup $availabilityGroup - } - - if ( ( $submittedParameters -contains 'AvailabilityMode' ) -and ( $AvailabilityMode -ne $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].AvailabilityMode ) ) - { - $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].AvailabilityMode = $AvailabilityMode - Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName] - } - - if ( ( $submittedParameters -contains 'BackupPriority' ) -and ( $BackupPriority -ne $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].BackupPriority ) ) - { - $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].BackupPriority = $BackupPriority - Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName] - } - - if ( ( $submittedParameters -contains 'BasicAvailabilityGroup' ) -and ( $sqlMajorVersion -ge 13 ) -and ( $BasicAvailabilityGroup -ne $availabilityGroup.BasicAvailabilityGroup ) ) - { - $availabilityGroup.BasicAvailabilityGroup = $BasicAvailabilityGroup - Update-AvailabilityGroup -AvailabilityGroup $availabilityGroup - } - - if ( ( $submittedParameters -contains 'DatabaseHealthTrigger' ) -and ( $sqlMajorVersion -ge 13 ) -and ( $DatabaseHealthTrigger -ne $availabilityGroup.DatabaseHealthTrigger ) ) - { - $availabilityGroup.DatabaseHealthTrigger = $DatabaseHealthTrigger - Update-AvailabilityGroup -AvailabilityGroup $availabilityGroup - } - - # Make sure ConnectionModeInPrimaryRole has a value in order to avoid false positive matches when the parameter is not defined - if ( ( $submittedParameters -contains 'ConnectionModeInPrimaryRole' ) -and ( -not [string]::IsNullOrEmpty($ConnectionModeInPrimaryRole) ) -and ( $ConnectionModeInPrimaryRole -ne $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].ConnectionModeInPrimaryRole ) ) - { - $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].ConnectionModeInPrimaryRole = $ConnectionModeInPrimaryRole - Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName] - } - - # Make sure ConnectionModeInSecondaryRole has a value in order to avoid false positive matches when the parameter is not defined - if ( ( $submittedParameters -contains 'ConnectionModeInSecondaryRole' ) -and ( -not [string]::IsNullOrEmpty($ConnectionModeInSecondaryRole) ) -and ( $ConnectionModeInSecondaryRole -ne $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].ConnectionModeInSecondaryRole ) ) - { - $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].ConnectionModeInSecondaryRole = $ConnectionModeInSecondaryRole - Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName] - } - - # Break out the EndpointUrl properties - $currentEndpointProtocol, $currentEndpointHostName, $currentEndpointPort = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].EndpointUrl.Replace('//', '').Split(':') - - if ( $endpoint.Protocol.Tcp.ListenerPort -ne $currentEndpointPort ) - { - $newEndpointUrl = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].EndpointUrl.Replace($currentEndpointPort, $endpoint.Protocol.Tcp.ListenerPort) - $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].EndpointUrl = $newEndpointUrl - Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName] - } - - if ( ( $submittedParameters -contains 'EndpointHostName' ) -and ( $EndpointHostName -ne $currentEndpointHostName ) ) - { - $newEndpointUrl = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].EndpointUrl.Replace($currentEndpointHostName, $EndpointHostName) - $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].EndpointUrl = $newEndpointUrl - Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName] - } - - if ( $currentEndpointProtocol -ne 'TCP' ) - { - $newEndpointUrl = $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].EndpointUrl.Replace($currentEndpointProtocol, 'TCP') - $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].EndpointUrl = $newEndpointUrl - Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName] - } - - # Make sure FailureConditionLevel has a value in order to avoid false positive matches when the parameter is not defined - if ( ( $submittedParameters -contains 'FailureConditionLevel' ) -and ( -not [string]::IsNullOrEmpty($FailureConditionLevel) ) -and ( $FailureConditionLevel -ne $availabilityGroup.FailureConditionLevel ) ) - { - $availabilityGroup.FailureConditionLevel = $FailureConditionLevel - Update-AvailabilityGroup -AvailabilityGroup $availabilityGroup - } - - if ( ( $submittedParameters -contains 'FailoverMode' ) -and ( $FailoverMode -ne $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].FailoverMode ) ) - { - $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName].FailoverMode = $FailoverMode - Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroup.AvailabilityReplicas[$serverObject.DomainInstanceName] - } - - if ( ( $submittedParameters -contains 'HealthCheckTimeout' ) -and ( $HealthCheckTimeout -ne $availabilityGroup.HealthCheckTimeout ) ) - { - $availabilityGroup.HealthCheckTimeout = $HealthCheckTimeout - Update-AvailabilityGroup -AvailabilityGroup $availabilityGroup - } - } - } - } -} - -<# - .SYNOPSIS - Determines if the availability group is in the desired state. - - .PARAMETER Name - The name of the availability group. - - .PARAMETER SQLServer - Hostname of the SQL Server to be configured. - - .PARAMETER SQLInstanceName - Name of the SQL instance to be configured. - - .PARAMETER Ensure - Specifies if the availability group should be present or absent. Default is Present. - - .PARAMETER AutomatedBackupPreference - Specifies the automated backup preference for the availability group. - - .PARAMETER AvailabilityMode - Specifies the replica availability mode. Default is 'AsynchronousCommit'. - - .PARAMETER BackupPriority - Specifies the desired priority of the replicas in performing backups. The acceptable values for this parameter are integers from 0 through 100. Of the set of replicas which are online and available, the replica that has the highest priority performs the backup. Default is 50. - - .PARAMETER BasicAvailabilityGroup - Specifies the type of availability group is Basic. This is only available is SQL Server 2016 and later and is ignored when applied to previous versions. - - .PARAMETER DatabaseHealthTrigger - Specifies if the option Database Level Health Detection is enabled. This is only available is SQL Server 2016 and later and is ignored when applied to previous versions. - - .PARAMETER DtcSupportEnabled - Specifies if the option Database DTC Support is enabled. This is only available is SQL Server 2016 and later and is ignored when applied to previous versions. - - .PARAMETER ConnectionModeInPrimaryRole - Specifies how the availability replica handles connections when in the primary role. - - .PARAMETER ConnectionModeInSecondaryRole - Specifies how the availability replica handles connections when in the secondary role. - - .PARAMETER EndpointHostName - Specifies the hostname or IP address of the availability group replica endpoint. Default is the instance network name. - - .PARAMETER FailureConditionLevel - Specifies the automatic failover behavior of the availability group. - - .PARAMETER HealthCheckTimeout - Specifies the length of time, in milliseconds, after which AlwaysOn availability groups declare an unresponsive server to be unhealthy. Default is 30,000. - - .PARAMETER ProcessOnlyOnActiveNode - Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server Instance. -#> -function Test-TargetResource -{ - [CmdletBinding()] - [OutputType([System.Boolean])] - Param - ( - [Parameter(Mandatory = $true)] - [String] - $Name, - - [Parameter(Mandatory = $true)] - [String] - $SQLServer, - - [Parameter(Mandatory = $true)] - [String] - $SQLInstanceName, - - [Parameter()] - [ValidateSet('Present', 'Absent')] - [String] - $Ensure = 'Present', - - [Parameter()] - [ValidateSet('Primary', 'SecondaryOnly', 'Secondary', 'None')] - [String] - $AutomatedBackupPreference = 'None', - - [Parameter()] - [ValidateSet('AsynchronousCommit', 'SynchronousCommit')] - [String] - $AvailabilityMode = 'AsynchronousCommit', - - [Parameter()] - [ValidateRange(0, 100)] - [UInt32] - $BackupPriority = 50, - - [Parameter()] - [Boolean] - $BasicAvailabilityGroup, - - [Parameter()] - [Boolean] - $DatabaseHealthTrigger, - - [Parameter()] - [Boolean] - $DtcSupportEnabled, - - [Parameter()] - [ValidateSet('AllowAllConnections', 'AllowReadWriteConnections')] - [String] - $ConnectionModeInPrimaryRole, - - [Parameter()] - [ValidateSet('AllowNoConnections', 'AllowReadIntentConnectionsOnly', 'AllowAllConnections')] - [String] - $ConnectionModeInSecondaryRole, - - [Parameter()] - [String] - $EndpointHostName, - - [Parameter()] - [ValidateSet('OnServerDown', 'OnServerUnresponsive', 'OnCriticalServerErrors', 'OnModerateServerErrors', 'OnAnyQualifiedFailureCondition')] - [String] - $FailureConditionLevel, - - [Parameter()] - [ValidateSet('Automatic', 'Manual')] - [String] - $FailoverMode = 'Manual', - - [Parameter()] - [UInt32] - $HealthCheckTimeout = 30000, - - [Parameter()] - [Boolean] - $ProcessOnlyOnActiveNode - ) - - $getTargetResourceParameters = @{ - SQLInstanceName = $SQLInstanceName - SQLServer = $SQLServer - Name = $Name - } - - # Assume this will pass. We will determine otherwise later - $result = $true - - $getTargetResourceResult = Get-TargetResource @getTargetResourceParameters - - <# - If this is supposed to process only the active node, and this is not the - active node, don't bother evaluating the test. - #> - if ( $ProcessOnlyOnActiveNode -and -not $getTargetResourceResult.IsActiveNode ) - { - New-VerboseMessage -Message ( 'The node "{0}" is not actively hosting the instance "{1}". Exiting the test.' -f $env:COMPUTERNAME,$SQLInstanceName ) - return $result - } - - # Define current version for check compatibility - $sqlMajorVersion = $getTargetResourceResult.Version - - switch ($Ensure) - { - 'Absent' - { - if ( $getTargetResourceResult.Ensure -eq 'Absent' ) - { - $result = $true - } - else - { - $result = $false - } - } - - 'Present' - { - $parametersToCheck = @( - 'Name', - 'SQLServer', - 'SQLInstanceName', - 'Ensure', - 'AutomatedBackupPreference', - 'AvailabilityMode', - 'BackupPriority', - 'ConnectionModeInPrimaryRole', - 'ConnectionModeInSecondaryRole', - 'FailureConditionLevel', - 'FailoverMode', - 'HealthCheckTimeout' - ) - - <# - Add properties compatible with SQL Server 2016 or later versions - DtcSupportEnabled is enabled at the creation of the Availability Group only, hence it will not be checked in this block - #> - if ( $sqlMajorVersion -ge 13 ) - { - $parametersToCheck += 'BasicAvailabilityGroup' - $parametersToCheck += 'DatabaseHealthTrigger' - } - - if ( $getTargetResourceResult.Ensure -eq 'Present' ) - { - # Use $PSBoundParameters rather than $MyInvocation.MyCommand.Parameters.GetEnumerator() - # This allows us to only validate the supplied parameters - # If the parameter is not defined by the configuration, we don't care what - # it gets set to. - foreach ( $parameter in $PSBoundParameters.GetEnumerator() ) - { - $parameterName = $parameter.Key - $parameterValue = Get-Variable -Name $parameterName -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Value - - # Make sure we don't try to validate a common parameter - if ( $parametersToCheck -notcontains $parameterName ) - { - continue - } - - if ( $getTargetResourceResult.($parameterName) -ne $parameterValue ) - { - New-VerboseMessage -Message "'$($parameterName)' should be '$($parameterValue)' but is '$($getTargetResourceResult.($parameterName))'" - - $result = $False - } - } - - # Get the Endpoint URL properties - $currentEndpointProtocol, $currentEndpointHostName, $currentEndpointPort = $getTargetResourceResult.EndpointUrl.Replace('//', '').Split(':') - - if ( -not $EndpointHostName ) - { - $EndpointHostName = $getTargetResourceResult.SQLServerNetName - } - - # Verify the hostname in the endpoint URL is correct - if ( $EndpointHostName -ne $currentEndpointHostName ) - { - New-VerboseMessage -Message "'EndpointHostName' should be '$EndpointHostName' but is '$currentEndpointHostName'" - $result = $false - } - - # Verify the protocol in the endpoint URL is correct - if ( 'TCP' -ne $currentEndpointProtocol ) - { - New-VerboseMessage -Message "'EndpointProtocol' should be 'TCP' but is '$currentEndpointProtocol'" - $result = $false - } - - # Verify the port in the endpoint URL is correct - if ( $getTargetResourceResult.EndpointPort -ne $currentEndpointPort ) - { - New-VerboseMessage -Message "'EndpointPort' should be '$($getTargetResourceResult.EndpointPort)' but is '$currentEndpointPort'" - $result = $false - } - } - else - { - $result = $false - } - } - } - - return $result -} - -<# - .SYNOPSIS - Executes the alter method on an Availability Group object. - - .PARAMETER AvailabilityGroup - The Availability Group object that must be altered. -#> -function Update-AvailabilityGroup -{ - param - ( - [Parameter(Mandatory = $true)] - [Microsoft.SqlServer.Management.Smo.AvailabilityGroup] - $AvailabilityGroup - ) - - try - { - $originalErrorActionPreference = $ErrorActionPreference - $ErrorActionPreference = 'Stop' - $AvailabilityGroup.Alter() - } - catch - { - throw New-TerminatingError -ErrorType AlterAvailabilityGroupFailed -FormatArgs $AvailabilityGroup.Name -ErrorCategory OperationStopped -InnerException $_.Exception - } - finally - { - $ErrorActionPreference = $originalErrorActionPreference - } -} - -Export-ModuleMember -Function *-TargetResource diff --git a/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1~HEAD b/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1~HEAD deleted file mode 100644 index 2117f87b2..000000000 --- a/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1~HEAD +++ /dev/null @@ -1,709 +0,0 @@ -Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'SqlServerDscHelper.psm1') ` - -Force - -<# - .SYNOPSIS - Gets the specified Availability Group Replica from the specified Availability Group. - - .PARAMETER Name - The name of the availability group replica. - - .PARAMETER AvailabilityGroupName - The name of the availability group. - - .PARAMETER SQLServer - Hostname of the SQL Server to be configured. - - .PARAMETER SQLInstanceName - Name of the SQL instance to be configued. -#> -function Get-TargetResource -{ - [CmdletBinding()] - [OutputType([System.Collections.Hashtable])] - param - ( - [Parameter(Mandatory = $true)] - [String] - $Name, - - [Parameter(Mandatory = $true)] - [String] - $AvailabilityGroupName, - - [Parameter(Mandatory = $true)] - [String] - $SQLServer, - - [Parameter(Mandatory = $true)] - [String] - $SQLInstanceName - ) - - # Connect to the instance - $serverObject = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName - - # Is this node actively hosting the SQL instance? - $isActiveNode = Test-ActiveNode -ServerObject $serverObject - - # Get the endpoint properties - $endpoint = $serverObject.Endpoints | Where-Object { $_.EndpointType -eq 'DatabaseMirroring' } - if ( $endpoint ) - { - $endpointPort = $endpoint.Protocol.Tcp.ListenerPort - } - - # Create the return object - $alwaysOnAvailabilityGroupReplicaResource = @{ - Ensure = 'Absent' - Name = '' - AvailabilityGroupName = '' - AvailabilityMode = '' - BackupPriority = '' - ConnectionModeInPrimaryRole = '' - ConnectionModeInSecondaryRole = '' - FailoverMode = '' - EndpointUrl = '' - IsActiveNode = $isActiveNode - ReadOnlyRoutingConnectionUrl = '' - ReadOnlyRoutingList = @() - SQLServer = $SQLServer - SQLInstanceName = $SQLInstanceName - EndpointPort = $endpointPort - SQLServerNetName = $serverObject.NetName - } - - # Get the availability group - $availabilityGroup = $serverObject.AvailabilityGroups[$AvailabilityGroupName] - - if ( $availabilityGroup ) - { - # Add the Availability Group name to the results - $alwaysOnAvailabilityGroupReplicaResource.AvailabilityGroupName = $availabilityGroup.Name - - # Try to find the replica - $availabilityGroupReplica = $availabilityGroup.AvailabilityReplicas[$Name] - - if ( $availabilityGroupReplica ) - { - # Add the Availability Group Replica properties to the results - $alwaysOnAvailabilityGroupReplicaResource.Ensure = 'Present' - $alwaysOnAvailabilityGroupReplicaResource.Name = $availabilityGroupReplica.Name - $alwaysOnAvailabilityGroupReplicaResource.AvailabilityMode = $availabilityGroupReplica.AvailabilityMode - $alwaysOnAvailabilityGroupReplicaResource.BackupPriority = $availabilityGroupReplica.BackupPriority - $alwaysOnAvailabilityGroupReplicaResource.ConnectionModeInPrimaryRole = $availabilityGroupReplica.ConnectionModeInPrimaryRole - $alwaysOnAvailabilityGroupReplicaResource.ConnectionModeInSecondaryRole = $availabilityGroupReplica.ConnectionModeInSecondaryRole - $alwaysOnAvailabilityGroupReplicaResource.FailoverMode = $availabilityGroupReplica.FailoverMode - $alwaysOnAvailabilityGroupReplicaResource.EndpointUrl = $availabilityGroupReplica.EndpointUrl - $alwaysOnAvailabilityGroupReplicaResource.ReadOnlyRoutingConnectionUrl = $availabilityGroupReplica.ReadOnlyRoutingConnectionUrl - $alwaysOnAvailabilityGroupReplicaResource.ReadOnlyRoutingList = $availabilityGroupReplica.ReadOnlyRoutingList - } - } - - return $alwaysOnAvailabilityGroupReplicaResource -} - -<# - .SYNOPSIS - Creates or removes the availability group replica in accordance with the desired state. - - .PARAMETER Name - The name of the availability group replica. - - .PARAMETER AvailabilityGroupName - The name of the availability group. - - .PARAMETER SQLServer - Hostname of the SQL Server to be configured. - - .PARAMETER SQLInstanceName - Name of the SQL instance to be configued. - - .PARAMETER PrimaryReplicaSQLServer - Hostname of the SQL Server where the primary replica is expected to be active. If the primary replica is not found here, the resource will attempt to find the host that holds the primary replica and connect to it. - - .PARAMETER PrimaryReplicaSQLInstanceName - Name of the SQL instance where the primary replica lives. - - .PARAMETER Ensure - Specifies if the availability group should be present or absent. Default is Present. - - .PARAMETER AvailabilityMode - Specifies the replica availability mode. Default is 'AsynchronousCommit'. - - .PARAMETER BackupPriority - Specifies the desired priority of the replicas in performing backups. The acceptable values for this parameter are integers from 0 through 100. Of the set of replicas which are online and available, the replica that has the highest priority performs the backup. Default is 50. - - .PARAMETER ConnectionModeInPrimaryRole - Specifies how the availability replica handles connections when in the primary role. - - .PARAMETER ConnectionModeInSecondaryRole - Specifies how the availability replica handles connections when in the secondary role. - - .PARAMETER EndpointHostName - Specifies the hostname or IP address of the availability group replica endpoint. Default is the instance network name which is set in the code because the value can only be determined when connected to the SQL Instance. - - .PARAMETER FailoverMode - Specifies the failover mode. Default is Manual. - - .PARAMETER ReadOnlyRoutingConnectionUrl - Specifies the fully-qualified domain name (FQDN) and port to use when routing to the replica for read only connections. - - .PARAMETER ReadOnlyRoutingList - Specifies an ordered list of replica server names that represent the probe sequence for connection director to use when redirecting read-only connections through this availability replica. This parameter applies if the availability replica is the current primary replica of the availability group. - - .PARAMETER ProcessOnlyOnActiveNode - Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server Instance. - Not used in Set-TargetResource. -#> -function Set-TargetResource -{ - [CmdletBinding()] - Param - ( - [Parameter(Mandatory = $true)] - [String] - $Name, - - [Parameter(Mandatory = $true)] - [String] - $AvailabilityGroupName, - - [Parameter(Mandatory = $true)] - [String] - $SQLServer, - - [Parameter(Mandatory = $true)] - [String] - $SQLInstanceName, - - [Parameter()] - [String] - $PrimaryReplicaSQLServer, - - [Parameter()] - [String] - $PrimaryReplicaSQLInstanceName, - - [Parameter()] - [ValidateSet('Present', 'Absent')] - [String] - $Ensure = 'Present', - - [Parameter()] - [ValidateSet('AsynchronousCommit', 'SynchronousCommit')] - [String] - $AvailabilityMode = 'AsynchronousCommit', - - [Parameter()] - [ValidateRange(0, 100)] - [UInt32] - $BackupPriority = 50, - - [Parameter()] - [ValidateSet('AllowAllConnections', 'AllowReadWriteConnections')] - [String] - $ConnectionModeInPrimaryRole, - - [Parameter()] - [ValidateSet('AllowNoConnections', 'AllowReadIntentConnectionsOnly', 'AllowAllConnections')] - [String] - $ConnectionModeInSecondaryRole, - - [Parameter()] - [String] - $EndpointHostName, - - [Parameter()] - [ValidateSet('Automatic', 'Manual')] - [String] - $FailoverMode = 'Manual', - - [Parameter()] - [String] - $ReadOnlyRoutingConnectionUrl, - - [Parameter()] - [String[]] - $ReadOnlyRoutingList, - - [Parameter()] - [Boolean] - $ProcessOnlyOnActiveNode - ) - - Import-SQLPSModule - - # Connect to the instance - $serverObject = Connect-SQL -SQLServer $SQLServer -SQLInstanceName $SQLInstanceName - - # Determine if HADR is enabled on the instance. If not, throw an error - if ( -not $serverObject.IsHadrEnabled ) - { - throw New-TerminatingError -ErrorType HadrNotEnabled -FormatArgs $Ensure, $SQLInstanceName -ErrorCategory NotImplemented - } - - # Get the Availability Group if it exists - $availabilityGroup = $serverObject.AvailabilityGroups[$AvailabilityGroupName] - - # Make sure we're communicating with the primary replica in order to make changes to the replica - if ( $availabilityGroup ) - { - while ( $availabilityGroup.LocalReplicaRole -ne 'Primary' ) - { - $primaryServerObject = Get-PrimaryReplicaServerObject -ServerObject $serverObject -AvailabilityGroup $availabilityGroup - $availabilityGroup = $primaryServerObject.AvailabilityGroups[$AvailabilityGroupName] - } - } - - switch ( $Ensure ) - { - Absent - { - if ( $availabilityGroup ) - { - $availabilityGroupReplica = $availabilityGroup.AvailabilityReplicas[$Name] - - if ( $availabilityGroupReplica ) - { - try - { - Remove-SqlAvailabilityReplica -InputObject $availabilityGroupReplica -Confirm:$false -ErrorAction Stop - } - catch - { - throw New-TerminatingError -ErrorType RemoveAvailabilityGroupReplicaFailed -FormatArgs $Name -ErrorCategory ResourceUnavailable -InnerException $_.Exception - } - } - } - } - - Present - { - # Ensure the appropriate cluster permissions are present - Test-ClusterPermissions -ServerObject $serverObject - - # Make sure a database mirroring endpoint exists. - $endpoint = $serverObject.Endpoints | Where-Object { $_.EndpointType -eq 'DatabaseMirroring' } - if ( -not $endpoint ) - { - throw New-TerminatingError -ErrorType DatabaseMirroringEndpointNotFound -FormatArgs $SQLServer, $SQLInstanceName -ErrorCategory ObjectNotFound - } - - # If a hostname for the endpoint was not specified, define it now. - if ( -not $EndpointHostName ) - { - $EndpointHostName = $serverObject.NetName - } - - # Get the endpoint port - $endpointPort = $endpoint.Protocol.Tcp.ListenerPort - - # Determine if the Availability Group exists on the instance - if ( $availabilityGroup ) - { - # Make sure the replia exists on the instance. If the availability group exists, the replica should exist. - $availabilityGroupReplica = $availabilityGroup.AvailabilityReplicas[$Name] - if ( $availabilityGroupReplica ) - { - if ( $AvailabilityMode -ne $availabilityGroupReplica.AvailabilityMode ) - { - $availabilityGroupReplica.AvailabilityMode = $AvailabilityMode - Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica - } - - if ( $BackupPriority -ne $availabilityGroupReplica.BackupPriority ) - { - $availabilityGroupReplica.BackupPriority = $BackupPriority - Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica - } - - # Make sure ConnectionModeInPrimaryRole has a value in order to avoid false positive matches when the parameter is not defined - if ( ( -not [string]::IsNullOrEmpty($ConnectionModeInPrimaryRole) ) -and ( $ConnectionModeInPrimaryRole -ne $availabilityGroupReplica.ConnectionModeInPrimaryRole ) ) - { - $availabilityGroupReplica.ConnectionModeInPrimaryRole = $ConnectionModeInPrimaryRole - Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica - } - - # Make sure ConnectionModeInSecondaryRole has a value in order to avoid false positive matches when the parameter is not defined - if ( ( -not [string]::IsNullOrEmpty($ConnectionModeInSecondaryRole) ) -and ( $ConnectionModeInSecondaryRole -ne $availabilityGroupReplica.ConnectionModeInSecondaryRole ) ) - { - $availabilityGroupReplica.ConnectionModeInSecondaryRole = $ConnectionModeInSecondaryRole - Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica - } - - # Break out the EndpointUrl properties - $currentEndpointProtocol, $currentEndpointHostName, $currentEndpointPort = $availabilityGroupReplica.EndpointUrl.Replace('//', '').Split(':') - - if ( $endpoint.Protocol.Tcp.ListenerPort -ne $currentEndpointPort ) - { - $newEndpointUrl = $availabilityGroupReplica.EndpointUrl.Replace($currentEndpointPort, $endpoint.Protocol.Tcp.ListenerPort) - $availabilityGroupReplica.EndpointUrl = $newEndpointUrl - Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica - } - - if ( $EndpointHostName -ne $currentEndpointHostName ) - { - $newEndpointUrl = $availabilityGroupReplica.EndpointUrl.Replace($currentEndpointHostName, $EndpointHostName) - $availabilityGroupReplica.EndpointUrl = $newEndpointUrl - Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica - } - - if ( $currentEndpointProtocol -ne 'TCP' ) - { - $newEndpointUrl = $availabilityGroupReplica.EndpointUrl.Replace($currentEndpointProtocol, 'TCP') - $availabilityGroupReplica.EndpointUrl = $newEndpointUrl - Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica - } - - if ( $FailoverMode -ne $availabilityGroupReplica.FailoverMode ) - { - $availabilityGroupReplica.FailoverMode = $FailoverMode - Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica - } - - if ( $ReadOnlyRoutingConnectionUrl -ne $availabilityGroupReplica.ReadOnlyRoutingConnectionUrl ) - { - $availabilityGroupReplica.ReadOnlyRoutingConnectionUrl = $ReadOnlyRoutingConnectionUrl - Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica - } - - if ( $ReadOnlyRoutingList -ne $availabilityGroupReplica.ReadOnlyRoutingList ) - { - $availabilityGroupReplica.ReadOnlyRoutingList = $ReadOnlyRoutingList - Update-AvailabilityGroupReplica -AvailabilityGroupReplica $availabilityGroupReplica - } - } - else - { - throw New-TerminatingError -ErrorType ReplicaNotFound -FormatArgs $Name, $SQLInstanceName -ErrorCategory ResourceUnavailable - } - } - else - { - # Connect to the instance that is supposed to house the primary replica - $primaryReplicaServerObject = Connect-SQL -SQLServer $PrimaryReplicaSQLServer -SQLInstanceName $PrimaryReplicaSQLInstanceName - - # Verify the Availability Group exists on the supplied primary replica - $primaryReplicaAvailabilityGroup = $primaryReplicaServerObject.AvailabilityGroups[$AvailabilityGroupName] - if ( $primaryReplicaAvailabilityGroup ) - { - # Make sure the instance defined as the primary replica in the parameters is actually the primary replica - $primaryReplicaServerObject = Get-PrimaryReplicaServerObject -ServerObject $primaryReplicaServerObject -AvailabilityGroup $primaryReplicaAvailabilityGroup - $availabilityGroup = $primaryReplicaServerObject.AvailabilityGroups[$AvailabilityGroupName] - - # Build the endpoint URL - $endpointUrl = "TCP://$($EndpointHostName):$($endpointPort)" - - $newAvailabilityGroupReplicaParams = @{ - Name = $Name - InputObject = $primaryReplicaAvailabilityGroup - AvailabilityMode = $AvailabilityMode - EndpointUrl = $endpointUrl - FailoverMode = $FailoverMode - Verbose = $false - } - - if ( $BackupPriority ) - { - $newAvailabilityGroupReplicaParams.Add('BackupPriority', $BackupPriority) - } - - if ( $ConnectionModeInPrimaryRole ) - { - $newAvailabilityGroupReplicaParams.Add('ConnectionModeInPrimaryRole', $ConnectionModeInPrimaryRole) - } - - if ( $ConnectionModeInSecondaryRole ) - { - $newAvailabilityGroupReplicaParams.Add('ConnectionModeInSecondaryRole', $ConnectionModeInSecondaryRole) - } - - if ( $ReadOnlyRoutingConnectionUrl ) - { - $newAvailabilityGroupReplicaParams.Add('ReadOnlyRoutingConnectionUrl', $ReadOnlyRoutingConnectionUrl) - } - - if ( $ReadOnlyRoutingList ) - { - $newAvailabilityGroupReplicaParams.Add('ReadOnlyRoutingList', $ReadOnlyRoutingList) - } - - # Create the Availability Group Replica - try - { - $availabilityGroupReplica = New-SqlAvailabilityReplica @newAvailabilityGroupReplicaParams - } - catch - { - throw New-TerminatingError -ErrorType CreateAvailabilityGroupReplicaFailed -FormatArgs $Name, $SQLInstanceName -ErrorCategory OperationStopped -InnerException $_.Exception - } - - # Join the Availability Group Replica to the Availability Group - try - { - $joinAvailabilityGroupResults = Join-SqlAvailabilityGroup -Name $AvailabilityGroupName -InputObject $serverObject - } - catch - { - throw New-TerminatingError -ErrorType JoinAvailabilityGroupFailed -FormatArgs $Name -ErrorCategory OperationStopped -InnerException $_.Exception - } - } - # The Availability Group doesn't exist on the primary replica - else - { - throw New-TerminatingError -ErrorType AvailabilityGroupNotFound -FormatArgs $AvailabilityGroupName, $PrimaryReplicaSQLInstanceName -ErrorCategory ResourceUnavailable - } - } - } - } -} - -<# - .SYNOPSIS - Determines if the availability group replica is in the desired state. - - .PARAMETER Name - The name of the availability group replica. - - .PARAMETER AvailabilityGroupName - The name of the availability group. - - .PARAMETER SQLServer - Hostname of the SQL Server to be configured. - - .PARAMETER SQLInstanceName - Name of the SQL instance to be configued. - - .PARAMETER PrimaryReplicaSQLServer - Hostname of the SQL Server where the primary replica is expected to be active. If the primary replica is not found here, the resource will attempt to find the host that holds the primary replica and connect to it. - - .PARAMETER PrimaryReplicaSQLInstanceName - Name of the SQL instance where the primary replica lives. - - .PARAMETER Ensure - Specifies if the availability group should be present or absent. Default is Present. - - .PARAMETER AvailabilityMode - Specifies the replica availability mode. Default is 'AsynchronousCommit'. - - .PARAMETER BackupPriority - Specifies the desired priority of the replicas in performing backups. The acceptable values for this parameter are integers from 0 through 100. Of the set of replicas which are online and available, the replica that has the highest priority performs the backup. Default is 50. - - .PARAMETER ConnectionModeInPrimaryRole - Specifies how the availability replica handles connections when in the primary role. - - .PARAMETER ConnectionModeInSecondaryRole - Specifies how the availability replica handles connections when in the secondary role. - - .PARAMETER EndpointHostName - Specifies the hostname or IP address of the availability group replica endpoint. Default is the instance network name which is set in the code because the value can only be determined when connected to the SQL Instance. - - .PARAMETER FailoverMode - Specifies the failover mode. Default is Manual. - - .PARAMETER ReadOnlyRoutingConnectionUrl - Specifies the fully-qualified domain name (FQDN) and port to use when routing to the replica for read only connections. - - .PARAMETER ReadOnlyRoutingList - Specifies an ordered list of replica server names that represent the probe sequence for connection director to use when redirecting read-only connections through this availability replica. This parameter applies if the availability replica is the current primary replica of the availability group. - - .PARAMETER ProcessOnlyOnActiveNode - Specifies that the resource will only determine if a change is needed if the target node is the active host of the SQL Server Instance. -#> -function Test-TargetResource -{ - [CmdletBinding()] - [OutputType([System.Boolean])] - Param - ( - [Parameter(Mandatory = $true)] - [String] - $Name, - - [Parameter(Mandatory = $true)] - [String] - $AvailabilityGroupName, - - [Parameter(Mandatory = $true)] - [String] - $SQLServer, - - [Parameter(Mandatory = $true)] - [String] - $SQLInstanceName, - - [Parameter()] - [String] - $PrimaryReplicaSQLServer, - - [Parameter()] - [String] - $PrimaryReplicaSQLInstanceName, - - [Parameter()] - [ValidateSet('Present', 'Absent')] - [String] - $Ensure = 'Present', - - [Parameter()] - [ValidateSet('AsynchronousCommit', 'SynchronousCommit')] - [String] - $AvailabilityMode = 'AsynchronousCommit', - - [Parameter()] - [ValidateRange(0, 100)] - [UInt32] - $BackupPriority = 50, - - [Parameter()] - [ValidateSet('AllowAllConnections', 'AllowReadWriteConnections')] - [String] - $ConnectionModeInPrimaryRole, - - [Parameter()] - [ValidateSet('AllowNoConnections', 'AllowReadIntentConnectionsOnly', 'AllowAllConnections')] - [String] - $ConnectionModeInSecondaryRole, - - [Parameter()] - [String] - $EndpointHostName, - - [Parameter()] - [ValidateSet('Automatic', 'Manual')] - [String] - $FailoverMode = 'Manual', - - [Parameter()] - [String] - $ReadOnlyRoutingConnectionUrl, - - [Parameter()] - [String[]] - $ReadOnlyRoutingList, - - [Parameter()] - [Boolean] - $ProcessOnlyOnActiveNode - ) - - $getTargetResourceParameters = @{ - SQLInstanceName = $SQLInstanceName - SQLServer = $SQLServer - Name = $Name - AvailabilityGroupName = $AvailabilityGroupName - } - - # Assume this will pass. We will determine otherwise later - $result = $true - - $getTargetResourceResult = Get-TargetResource @getTargetResourceParameters - - <# - If this is supposed to process only the active node, and this is not the - active node, don't bother evaluating the test. - #> - if ( $ProcessOnlyOnActiveNode -and -not $getTargetResourceResult.IsActiveNode ) - { - # Use localization if the resource has been converted - New-VerboseMessage -Message ( 'The node "{0}" is not actively hosting the instance "{1}". Exiting the test.' -f $env:COMPUTERNAME,$SQLInstanceName ) - return $result - } - - switch ($Ensure) - { - 'Absent' - { - if ( $getTargetResourceResult.Ensure -eq 'Absent' ) - { - $result = $true - } - else - { - $result = $false - } - } - - 'Present' - { - $parametersToCheck = @( - 'Name', - 'AvailabilityGroupName', - 'SQLServer', - 'SQLInstanceName', - 'Ensure', - 'AvailabilityMode', - 'BackupPriority', - 'ConnectionModeInPrimaryRole', - 'ConnectionModeInSecondaryRole', - 'FailoverMode', - 'ReadOnlyRoutingConnectionUrl', - 'ReadOnlyRoutingList' - ) - - if ( $getTargetResourceResult.Ensure -eq 'Present' ) - { - # PsBoundParameters won't work here because it doesn't account for default values - foreach ( $parameter in $MyInvocation.MyCommand.Parameters.GetEnumerator() ) - { - $parameterName = $parameter.Key - $parameterValue = Get-Variable -Name $parameterName -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Value - - # Make sure we don't try to validate a common parameter - if ( $parametersToCheck -contains $parameterName ) - { - # If the parameter is Null, a value wasn't provided - if ( -not [string]::IsNullOrEmpty($parameterValue) ) - { - if ( $getTargetResourceResult.($parameterName) -ne $parameterValue ) - { - New-VerboseMessage -Message "'$($parameterName)' should be '$($parameterValue)' but is '$($getTargetResourceResult.($parameterName))'" - - $result = $false - } - } - } - } - - # Get the Endpoint URL properties - $currentEndpointProtocol, $currentEndpointHostName, $currentEndpointPort = $getTargetResourceResult.EndpointUrl.Replace('//', '').Split(':') - - if ( -not $EndpointHostName ) - { - $EndpointHostName = $getTargetResourceResult.SQLServerNetName - } - - # Verify the hostname in the endpoint URL is correct - if ( $EndpointHostName -ne $currentEndpointHostName ) - { - New-VerboseMessage -Message "'EndpointHostName' should be '$EndpointHostName' but is '$currentEndpointHostName'" - $result = $false - } - - # Verify the protocol in the endpoint URL is correct - if ( 'TCP' -ne $currentEndpointProtocol ) - { - New-VerboseMessage -Message "'EndpointProtocol' should be 'TCP' but is '$currentEndpointProtocol'" - $result = $false - } - - # Verify the port in the endpoint URL is correct - if ( $getTargetResourceResult.EndpointPort -ne $currentEndpointPort ) - { - New-VerboseMessage -Message "'EndpointPort' should be '$($getTargetResourceResult.EndpointPort)' but is '$currentEndpointPort'" - $result = $false - } - } - else - { - $result = $false - } - } - } - - return $result -} - -Export-ModuleMember -Function *-TargetResource From be4a8143630d29fb0209b1fc4808225dbdb3ef6b Mon Sep 17 00:00:00 2001 From: Johan Ljunggren Date: Sat, 18 Nov 2017 15:53:18 +0100 Subject: [PATCH 40/42] Fix review comments (up to r10) --- .github/ISSUE_TEMPLATE.md | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 2 +- README.md | 4 +- SQLServerDsc.psd1 | 283 ++++++++---------- SqlServerDscHelper.psm1 | 8 +- Tests/Integration/MSFT_SqlSetup.config.ps1 | 2 +- Tests/Unit/MSFT_SqlAGListener.Tests.ps1 | 6 +- .../MSFT_SqlDatabaseDefaultLocation.Tests.ps1 | 2 +- en-US/SqlServerDscHelper.strings.psd1 | 2 +- sv-SE/SqlServerDscHelper.strings.psd1 | 2 +- 10 files changed, 141 insertions(+), 172 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 37a3b368b..337ea35d0 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -4,7 +4,7 @@ Your feedback and support is greatly appreciated, thanks for contributing! Please prefix the issue title with the resource name, i.e. 'SqlSetup: Short description of my issue' Please provide the following information regarding your issue (place N/A if the fields that don't apply to your issue): -If you like to contribute more please feel free to read the contributing section at https://github.com/PowerShell/xSQLServer#contributing. +If you like to contribute more please feel free to read the contributing section at https://github.com/PowerShell/SQLServerDsc#contributing. --> **Details of the scenario you tried and the problem that is occurring:** diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 0fc009d55..7b84ac775 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -3,7 +3,7 @@ Thanks for submitting a Pull Request (PR) to this project. Your contribution to this project is greatly appreciated! Please make sure you have read the contributing section -at https://github.com/PowerShell/xSQLServer#contributing. +at https://github.com/PowerShell/SqlServerDsc#contributing. Please prefix the PR title with the resource name, i.e. 'SqlSetup: My short description' diff --git a/README.md b/README.md index 8d83bd6d9..c5ba0a6d4 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ questions or comments. ### master -[![Build status](https://ci.appveyor.com/api/projects/status/mxn453y284eab8li/branch/master?svg=true)](https://ci.appveyor.com/project/PowerShell/xsqlserver/branch/master) +[![Build status](https://ci.appveyor.com/api/projects/status/mxn453y284eab8li/branch/master?svg=true)](https://ci.appveyor.com/project/PowerShell/SqlServerDsc/branch/master) [![codecov](https://codecov.io/gh/PowerShell/SqlServerDsc/branch/master/graph/badge.svg)](https://codecov.io/gh/PowerShell/SqlServerDsc/branch/master) This is the branch containing the latest release - @@ -20,7 +20,7 @@ no contributions should be made directly to this branch. ### dev -[![Build status](https://ci.appveyor.com/api/projects/status/mxn453y284eab8li/branch/dev?svg=true)](https://ci.appveyor.com/project/PowerShell/xsqlserver/branch/dev) +[![Build status](https://ci.appveyor.com/api/projects/status/mxn453y284eab8li/branch/dev?svg=true)](https://ci.appveyor.com/project/PowerShell/SqlServerDsc/branch/dev) [![codecov](https://codecov.io/gh/PowerShell/SqlServerDsc/branch/dev/graph/badge.svg)](https://codecov.io/gh/PowerShell/SqlServerDsc/branch/dev) This is the development branch diff --git a/SQLServerDsc.psd1 b/SQLServerDsc.psd1 index 3f7051cdb..ea95e5732 100644 --- a/SQLServerDsc.psd1 +++ b/SQLServerDsc.psd1 @@ -1,158 +1,127 @@ @{ -# Version number of this module. -ModuleVersion = '8.2.0.0' - -# ID used to uniquely identify this module -GUID = '74e9ddb5-4cbc-4fa2-a222-2bcfb533fd66' - -# Author of this module -Author = 'Microsoft Corporation' - -# Company or vendor of this module -CompanyName = 'Microsoft Corporation' - -# Copyright statement for this module -Copyright = '(c) 2017 Microsoft Corporation. All rights reserved.' - -# Description of the functionality provided by this module -Description = 'Module with DSC Resources for deployment and configuration of Microsoft SQL Server.' - -# Minimum version of the Windows PowerShell engine required by this module -PowerShellVersion = '5.0' - -# Minimum version of the common language runtime (CLR) required by this module -CLRVersion = '4.0' - -# Functions to export from this module -FunctionsToExport = '*' - -# Cmdlets to export from this module -CmdletsToExport = '*' - -RequiredAssemblies = @() - -# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. -PrivateData = @{ - - PSData = @{ - - # Tags applied to this module. These help with module discovery in online galleries. - Tags = @('DesiredStateConfiguration', 'DSC', 'DSCResourceKit', 'DSCResource') - - # A URL to the license for this module. - LicenseUri = 'https://github.com/PowerShell/xSQLServer/blob/master/LICENSE' - - # A URL to the main website for this project. - ProjectUri = 'https://github.com/PowerShell/xSQLServer' - - # A URL to an icon representing this module. - # IconUri = '' - - # ReleaseNotes of this module - ReleaseNotes = '- Changes to xSQLServer - - Updated Pester syntax to v4 - - Fixes broken links to issues in the CHANGELOG.md. -- Changes to xSQLServerDatabase - - Added parameter to specify collation for a database to be different from server - collation ([issue 767](https://github.com/PowerShell/xSQLServer/issues/767)). - - Fixed unit tests for Get-TargetResource to ensure correctly testing return - values ([issue 849](https://github.com/PowerShell/xSQLServer/issues/849)) -- Changes to xSQLServerAlwaysOnAvailabilityGroup - - Refactored the unit tests to allow them to be more user friendly and to test - additional SQLServer variations. - - Each test will utilize the Import-SQLModuleStub to ensure the correct - module is loaded ([issue 784](https://github.com/PowerShell/xSQLServer/issues/784)). - - Fixed an issue when setting the SQLServer parameter to a Fully Qualified - Domain Name (FQDN) ([issue 468](https://github.com/PowerShell/xSQLServer/issues/468)). - - Fixed the logic so that if a parameter is not supplied to the resource, the - resource will not attempt to apply the defaults on subsequent checks - ([issue 517](https://github.com/PowerShell/xSQLServer/issues/517)). - - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, - the resource will only determine if a change is needed if the target node - is the active host of the SQL Server instance ([issue 868](https://github.com/PowerShell/xSQLServer/issues/868)). -- Changes to xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership - - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, - the resource will only determine if a change is needed if the target node - is the active host of the SQL Server instance ([issue 869](https://github.com/PowerShell/xSQLServer/issues/869)). -- Changes to xSQLServerAlwaysOnAvailabilityGroupReplica - - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, - the resource will only determine if a change is needed if the target node is - the active host of the SQL Server instance ([issue 870](https://github.com/PowerShell/xSQLServer/issues/870)). -- Added the CommonTestHelper.psm1 to store common testing functions. - - Added the Import-SQLModuleStub function to ensure the correct version of the - module stubs are loaded ([issue 784](https://github.com/PowerShell/xSQLServer/issues/784)). -- Changes to xSQLServerMemory - - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, - the resource will only determine if a change is needed if the target node - is the active host of the SQL Server instance ([issue 867](https://github.com/PowerShell/xSQLServer/issues/867)). -- Changes to xSQLServerNetwork - - BREAKING CHANGE: Renamed parameter TcpDynamicPorts to TcpDynamicPort and - changed type to Boolean ([issue 534](https://github.com/PowerShell/xSQLServer/issues/534)). - - Resolved issue when switching from dynamic to static port. - configuration ([issue 534](https://github.com/PowerShell/xSQLServer/issues/534)). - - Added localization (en-US) for all strings in resource and unit tests - ([issue 618](https://github.com/PowerShell/xSQLServer/issues/618)). - - Updated examples to reflect new parameters. -- Changes to xSQLServerRSConfig - - Added examples -- Added resource - - xSQLServerDatabaseDefaultLocation - ([issue 656](https://github.com/PowerShell/xSQLServer/issues/656)) -- Changes to xSQLServerEndpointPermission - - Fixed a problem when running the tests locally in a PowerShell console it - would ask for parameters ([issue 897](https://github.com/PowerShell/xSQLServer/issues/897)). -- Changes to xSQLServerAvailabilityGroupListener - - Fixed a problem when running the tests locally in a PowerShell console it - would ask for parameters ([issue 897](https://github.com/PowerShell/xSQLServer/issues/897)). -- Changes to xSQLServerMaxDop - - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, - the resource will only determine if a change is needed if the target node - is the active host of the SQL Server instance ([issue 882](https://github.com/PowerShell/xSQLServer/issues/882)). - - Fixed the formatting for the AvailabilityGroupNotFound error. - - Added the following read-only properties to the schema ([issue 477](https://github.com/PowerShell/xSQLServer/issues/477)) - - EndpointPort - - EndpointURL - - Use the new helper function "Test-ClusterPermissions". - - Use the Get-PrimaryReplicaServerObject helper function -- Changes to xSQLServerHelper - - Fixed Connect-SQL by ensuring the Status property returns "Online" prior to - returning the SQL Server object ([issue 333](https://github.com/PowerShell/xSQLServer/issues/333)). -- Changes to xSQLServerRole - - Running Get-DscConfiguration no longer throws an error saying property - Members is not an array ([issue 790](https://github.com/PowerShell/xSQLServer/issues/790)). -- Changes to xSQLServerMaxDop - - Fixed error where Measure-Object cmdlet would fail claiming it could not - find the specified property ([issue 801](https://github.com/PowerShell/xSQLServer/issues/801)) -- Changes to xSQLServerAlwaysOnService - - Added integration test ([issue 736](https://github.com/PowerShell/xSQLServer/issues/736)). - - Added ErrorAction "Stop" to the cmdlet Start-DscConfiguration - ([issue 824](https://github.com/PowerShell/xSQLServer/issues/824)). -- Changes to SMO.cs - - Added default properties to the Server class - - AvailabilityGroups - - Databases - - EndpointCollection - - Added a new overload to the Login class - - Added default properties to the AvailabilityReplicas class - - AvailabilityDatabases - - AvailabilityReplicas -- Added new resource xSQLServerAccount ([issue 706](https://github.com/PowerShell/xSQLServer/issues/706)) - - Added localization support for all strings - - Added examples for usage -- Changes to SqlRS - - No longer returns a null value from Test-TargetResource when Reporting - Services has not been initialized ([issue 822](https://github.com/PowerShell/xSQLServer/issues/822)). - - Fixed so that when two Reporting Services are installed for the same major - version the resource does not throw an error ([issue 819](https://github.com/PowerShell/xSQLServer/issues/819)). - - Now the resource will restart the Reporting Services service after - initializing ([issue 592](https://github.com/PowerShell/xSQLServer/issues/592)). - This will enable the Reports site to work. - - Added integration test ([issue 753](https://github.com/PowerShell/xSQLServer/issues/753)). - - Added support for configuring URL reservations and virtual directory names - ([issue 570](https://github.com/PowerShell/xSQLServer/issues/570)) -' - - } # End of PSData hashtable - -} # End of PrivateData hashtable -} + # Version number of this module. + ModuleVersion = '9.0.0.0' + + # ID used to uniquely identify this module + GUID = '74e9ddb5-4cbc-4fa2-a222-2bcfb533fd66' + + # Author of this module + Author = 'Microsoft Corporation' + + # Company or vendor of this module + CompanyName = 'Microsoft Corporation' + + # Copyright statement for this module + Copyright = '(c) 2017 Microsoft Corporation. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'Module with DSC Resources for deployment and configuration of Microsoft SQL Server.' + + # Minimum version of the Windows PowerShell engine required by this module + PowerShellVersion = '5.0' + + # Minimum version of the common language runtime (CLR) required by this module + CLRVersion = '4.0' + + # Functions to export from this module + FunctionsToExport = '*' + + # Cmdlets to export from this module + CmdletsToExport = '*' + + RequiredAssemblies = @() + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + + PSData = @{ + + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('DesiredStateConfiguration', 'DSC', 'DSCResourceKit', 'DSCResource') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/PowerShell/SqlServerDsc/blob/master/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/PowerShell/SqlServerDsc' + + # A URL to an icon representing this module. + # IconUri = '' + + # ReleaseNotes of this module + ReleaseNotes = '- Changes to xSQLServer + - Updated Pester syntax to v4 + - Fixes broken links to issues in the CHANGELOG.md. + - Changes to xSQLServerDatabase + - Added parameter to specify collation for a database to be different from server + collation ([issue 767](https://github.com/PowerShell/xSQLServer/issues/767)). + - Fixed unit tests for Get-TargetResource to ensure correctly testing return + values ([issue 849](https://github.com/PowerShell/xSQLServer/issues/849)) + - Changes to xSQLServerAlwaysOnAvailabilityGroup + - Refactored the unit tests to allow them to be more user friendly and to test + additional SQLServer variations. + - Each test will utilize the Import-SQLModuleStub to ensure the correct + module is loaded ([issue 784](https://github.com/PowerShell/xSQLServer/issues/784)). + - Fixed an issue when setting the SQLServer parameter to a Fully Qualified + Domain Name (FQDN) ([issue 468](https://github.com/PowerShell/xSQLServer/issues/468)). + - Fixed the logic so that if a parameter is not supplied to the resource, the + resource will not attempt to apply the defaults on subsequent checks + ([issue 517](https://github.com/PowerShell/xSQLServer/issues/517)). + - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, + the resource will only determine if a change is needed if the target node + is the active host of the SQL Server instance ([issue 868](https://github.com/PowerShell/xSQLServer/issues/868)). + - Changes to xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership + - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, + the resource will only determine if a change is needed if the target node + is the active host of the SQL Server instance ([issue 869](https://github.com/PowerShell/xSQLServer/issues/869)). + - Changes to xSQLServerAlwaysOnAvailabilityGroupReplica + - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, + the resource will only determine if a change is needed if the target node is + the active host of the SQL Server instance ([issue 870](https://github.com/PowerShell/xSQLServer/issues/870)). + - Added the CommonTestHelper.psm1 to store common testing functions. + - Added the Import-SQLModuleStub function to ensure the correct version of the + module stubs are loaded ([issue 784](https://github.com/PowerShell/xSQLServer/issues/784)). + - Changes to xSQLServerMemory + - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, + the resource will only determine if a change is needed if the target node + is the active host of the SQL Server instance ([issue 867](https://github.com/PowerShell/xSQLServer/issues/867)). + - Changes to xSQLServerNetwork + - BREAKING CHANGE: Renamed parameter TcpDynamicPorts to TcpDynamicPort and + changed type to Boolean ([issue 534](https://github.com/PowerShell/xSQLServer/issues/534)). + - Resolved issue when switching from dynamic to static port. + configuration ([issue 534](https://github.com/PowerShell/xSQLServer/issues/534)). + - Added localization (en-US) for all strings in resource and unit tests + ([issue 618](https://github.com/PowerShell/xSQLServer/issues/618)). + - Updated examples to reflect new parameters. + - Changes to xSQLServerRSConfig + - Added examples + - Added resource + - xSQLServerDatabaseDefaultLocation + ([issue 656](https://github.com/PowerShell/xSQLServer/issues/656)) + - Changes to xSQLServerEndpointPermission + - Fixed a problem when running the tests locally in a PowerShell console it + would ask for parameters ([issue 897](https://github.com/PowerShell/xSQLServer/issues/897)). + - Changes to xSQLServerAvailabilityGroupListener + - Fixed a problem when running the tests locally in a PowerShell console it + would ask for parameters ([issue 897](https://github.com/PowerShell/xSQLServer/issues/897)). + - Changes to xSQLServerMaxDop + - Made the resource cluster aware. When ProcessOnlyOnActiveNode is specified, + the resource will only determine if a change is needed if the target node + is the active host of the SQL Server instance ([issue 882](https://github.com/PowerShell/xSQLServer/issues/882)). + + ' + + } # End of PSData hashtable + + } # End of PrivateData hashtable + } + + + + + + + + + + diff --git a/SqlServerDscHelper.psm1 b/SqlServerDscHelper.psm1 index ff3da136d..bc8048448 100644 --- a/SqlServerDscHelper.psm1 +++ b/SqlServerDscHelper.psm1 @@ -342,8 +342,8 @@ function Get-SqlInstanceMajorVersion Returns a localized error message. This helper function is obsolete, should use new helper functions. - https://github.com/PowerShell/xSQLServer/blob/dev/CONTRIBUTING.md#localization - https://github.com/PowerShell/xSQLServer/blob/dev/DSCResources/CommonResourceHelper.psm1 + https://github.com/PowerShell/SqlServerDsc/blob/dev/CONTRIBUTING.md#localization + https://github.com/PowerShell/SqlServerDsc/blob/dev/DSCResources/CommonResourceHelper.psm1 Strings in this function has not been localized since this helper function should be removed when all resources has moved over to the new localization, @@ -441,7 +441,7 @@ function New-TerminatingError This helper function is obsolete, should use Write-Warning together with individual resource localization strings. - https://github.com/PowerShell/xSQLServer/blob/dev/CONTRIBUTING.md#localization + https://github.com/PowerShell/SqlServerDsc/blob/dev/CONTRIBUTING.md#localization Strings in this function has not been localized since this helper function should be removed when all resources has moved over to the new localization, @@ -496,7 +496,7 @@ function New-WarningMessage This helper function is obsolete, should use Write-Verbose together with individual resource localization strings. - https://github.com/PowerShell/xSQLServer/blob/dev/CONTRIBUTING.md#localization + https://github.com/PowerShell/SqlServerDsc/blob/dev/CONTRIBUTING.md#localization Strings in this function has not been localized since this helper function should be removed when all resources has moved over to the new localization, diff --git a/Tests/Integration/MSFT_SqlSetup.config.ps1 b/Tests/Integration/MSFT_SqlSetup.config.ps1 index 6147bdaa1..8843f48aa 100644 --- a/Tests/Integration/MSFT_SqlSetup.config.ps1 +++ b/Tests/Integration/MSFT_SqlSetup.config.ps1 @@ -55,7 +55,7 @@ Configuration MSFT_SqlSetup_InstallSqlEngineAsSystem_Config Import-DscResource -ModuleName 'PSDscResources' Import-DscResource -ModuleName 'xStorage' - Import-DscResource -ModuleName 'SqlServerDSC' + Import-DscResource -ModuleName 'SqlServerDsc' node localhost { xMountImage 'MountIsoMedia' diff --git a/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 b/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 index 9c2ae885f..305000356 100644 --- a/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 @@ -93,7 +93,7 @@ try #endregion Pester Test Initialization - Describe 'SqlServerAGListener\Get-TargetResource' { + Describe 'SqlAGListener\Get-TargetResource' { BeforeEach { $testParameters = $defaultParameters.Clone() @@ -224,7 +224,7 @@ try Assert-VerifiableMock } - Describe 'SqlServerAGListener\Test-TargetResource' { + Describe 'SqlAGListener\Test-TargetResource' { BeforeEach { $testParameters = $defaultParameters.Clone() } @@ -509,7 +509,7 @@ try Assert-VerifiableMock } - Describe 'SqlServerAGListener\Set-TargetResource' { + Describe 'SqlAGListener\Set-TargetResource' { BeforeEach { $testParameters = $defaultParameters.Clone() diff --git a/Tests/Unit/MSFT_SqlDatabaseDefaultLocation.Tests.ps1 b/Tests/Unit/MSFT_SqlDatabaseDefaultLocation.Tests.ps1 index dd6cff12b..561799653 100644 --- a/Tests/Unit/MSFT_SqlDatabaseDefaultLocation.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlDatabaseDefaultLocation.Tests.ps1 @@ -13,7 +13,7 @@ Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -P Add-Type -Path ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stubs ) -ChildPath SMO.cs ) $TestEnvironment = Initialize-TestEnvironment ` - -DSCModuleName 'SqlServerDSC' ` + -DSCModuleName 'SqlServerDsc' ` -DSCResourceName 'MSFT_SqlDatabaseDefaultLocation' ` -TestType Unit diff --git a/en-US/SqlServerDscHelper.strings.psd1 b/en-US/SqlServerDscHelper.strings.psd1 index ab81b005b..2f940d248 100644 --- a/en-US/SqlServerDscHelper.strings.psd1 +++ b/en-US/SqlServerDscHelper.strings.psd1 @@ -46,7 +46,7 @@ ConvertFrom-StringData @' # - NOTE! # - Below strings are used by helper functions New-TerminatingError and New-WarningMessage. - # - These strings were merged from old xSQLServer.strings.psd1. These will be moved to it's individual + # - These strings were merged from old SqlServerDsc.strings.psd1. These will be moved to it's individual # - resource when that resources get moved over to the new localization. # - NOTE! diff --git a/sv-SE/SqlServerDscHelper.strings.psd1 b/sv-SE/SqlServerDscHelper.strings.psd1 index c3dd3e7c7..947a96889 100644 --- a/sv-SE/SqlServerDscHelper.strings.psd1 +++ b/sv-SE/SqlServerDscHelper.strings.psd1 @@ -41,7 +41,7 @@ ConvertFrom-StringData @' # - NOTE! # - Below strings are used by helper functions New-TerminatingError and New-WarningMessage. - # - These strings were merged from old xSQLServer.strings.psd1. These will be moved to it's individual + # - These strings were merged from old SqlServerDsc.strings.psd1. These will be moved to it's individual # - resource when that resources get moved over to the new localization. # - NOTE! From 1beb346108d7a6cbb3754a73b5260ce8c6d215eb Mon Sep 17 00:00:00 2001 From: Johan Ljunggren Date: Sat, 18 Nov 2017 16:01:02 +0100 Subject: [PATCH 41/42] Fix typo in tests for SqlDatabaseRecoveryModel --- Tests/Unit/MSFT_SqlDatabaseRecoveryModel.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Unit/MSFT_SqlDatabaseRecoveryModel.Tests.ps1 b/Tests/Unit/MSFT_SqlDatabaseRecoveryModel.Tests.ps1 index 92017da44..fefffa66f 100644 --- a/Tests/Unit/MSFT_SqlDatabaseRecoveryModel.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlDatabaseRecoveryModel.Tests.ps1 @@ -1,4 +1,4 @@ -$script:DSCModuleName = 'SqlServerDSC' +$script:DSCModuleName = 'SqlServerDsc' $script:DSCResourceName = 'MSFT_SqlDatabaseRecoveryModel' #region HEADER From 5482b0db8249e2fc7414a36d778122a910dfe4db Mon Sep 17 00:00:00 2001 From: Johan Ljunggren Date: Sat, 18 Nov 2017 16:14:35 +0100 Subject: [PATCH 42/42] Fix the resources in alphabetical order --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index c5ba0a6d4..656a51e53 100644 --- a/README.md +++ b/README.md @@ -111,13 +111,13 @@ A full list of changes in each version can be found in the [change log](CHANGELO * [**SqlAG**](#sqlag) resource to ensure an availability group is present or absent. -* [**SqlAGDatabase**](#SqlAGDatabase) +* [**SqlAGDatabase**](#sqlagdatabase) to manage the database membership in Availability Groups. +* [**SqlAGListener**](#sqlaglistener) + Create or remove an availability group listener. * [**SqlAGReplica**](#sqlagreplica) resource to ensure an availability group replica is present or absent. * [**SqlAlias**](#sqlalias) resource to manage SQL Server client Aliases. -* [**SqlAGListener**](#sqlaglistener) - Create or remove an availability group listener. * [**SqlAlwaysOnService**](#sqlalwaysonservice) resource to enable always on on a SQL Server. * [**SqlDatabase**](#sqldatabase) resource to manage ensure database @@ -132,6 +132,10 @@ A full list of changes in each version can be found in the [change log](CHANGELO to manage database recovery model. * [**SqlDatabaseRole**](#sqldatabaserole) resource to manage SQL database roles. +* [**SqlRS**](#sqlrs) configures SQL Server Reporting + Services to use a database engine in another instance. +* [**SqlRSSecureConnectionLevel**](#sqlrssecureconnectionlevel) sets + the secure connection level for SQL Server Reporting Services. * [**SqlScript**](#sqlscript) resource to extend DSC Get/Set/Test functionality to T-SQL. * [**SqlServerConfiguration**](#sqlserverconfiguration) resource to manage @@ -155,10 +159,6 @@ A full list of changes in each version can be found in the [change log](CHANGELO * [**SqlServiceAccount**](#sqlserviceaccount) Manage the service account for SQL Server services. * [**SqlSetup**](#sqlsetup) installs a standalone SQL Server instance. -* [**SqlRS**](#sqlrs) configures SQL Server Reporting - Services to use a database engine in another instance. -* [**SqlRSSecureConnectionLevel**](#sqlrssecureconnectionlevel) sets - the secure connection level for SQL Server Reporting Services. * [**SqlWaitForAG**](#sqlwaitforag) resource to wait until availability group is created on primary server. * [**SqlWindowsFirewall**](#sqlwindowsfirewall) configures firewall settings to

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 i$=~Uuwe9Z;-!^r_lY6}t$|y-c Date: Thu, 2 Nov 2017 18:22:18 -0500 Subject: [PATCH 03/42] first pass at complete rename --- .github/ISSUE_TEMPLATE.md | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 4 +- CHANGELOG.md | 4 + CONTRIBUTING.md | 40 +- DSCResources/CommonResourceHelper.psm1 | 2 +- .../MSFT_SqlAG.psm1} | 2 +- .../MSFT_xSqlAG.schema.mof} | 4 +- .../MSFT_SqlAGDatabases.psm1} | 4 +- .../MSFT_SqlAGDatabases.schema.mof} | 4 +- .../en-US/MSFT_SqlAGDatabases.strings.psd1} | 2 +- .../en-US/about_SqlAGDatabases.help.txt} | 0 .../MSFT_SqlAGListener.psm1} | 2 +- .../MSFT_SqlAGListener.schema.mof} | 4 +- .../MSFT_SqlAGReplica.psm1} | 2 +- .../MSFT_SqlAGReplica.schema.mof} | 4 +- .../MSFT_SqlAlias.psm1} | 2 +- .../MSFT_SqlAlias.schema.mof} | 4 +- .../MSFT_SqlAlwaysOnService.psm1} | 2 +- .../MSFT_SqlAlwaysOnService.schema.mof} | 18 +- .../MSFT_SqlDatabase.psm1} | 2 +- .../MSFT_SqlDatabase.schema.mof} | 4 +- .../MSFT_SqlDatabaseDefaultLocation.psm1} | 4 +- ...SFT_SqlDatabaseDefaultLocation.schema.mof} | 4 +- ...T_SqlDatabaseDefaultLocation.strings.psd1} | 2 +- .../MSFT_SqlDatabaseOwner.psm1} | 2 +- .../MSFT_SqlDatabaseOwner.schema.mof} | 4 +- .../MSFT_SqlDatabasePermission.psm1} | 2 +- .../MSFT_SqlDatabasePermission.schema.mof} | 4 +- .../MSFT_SqlDatabaseRecoveryModel.psm1} | 2 +- .../MSFT_SqlDatabaseRecoveryModel.schema.mof} | 4 +- .../MSFT_SqlDatabaseRole.psm1} | 2 +- .../MSFT_SqlDatabaseRole.schema.mof} | 4 +- .../MSFT_SqlRS.psm1} | 2 +- .../MSFT_SqlRS.schema.mof} | 4 +- .../MSFT_SqlRSSecureConnectionLevel.psm1} | 2 +- ...SFT_SqlRSSecureConnectionLevel.schema.mof} | 4 +- .../MSFT_SqlScript.psm1} | 2 +- .../MSFT_SqlScript.schema.mof} | 4 +- .../MSFT_SqlServerConfiguration.psm1} | 2 +- .../MSFT_SqlServerConfiguration.schema.mof} | 4 +- .../MSFT_SqlServerEndpoint.psm1} | 2 +- .../MSFT_SqlServerEndpoint.schema.mof} | 4 +- .../MSFT_SqlServerEndpointPermission.psm1} | 2 +- ...FT_SqlServerEndpointPermission.schema.mof} | 4 +- .../MSFT_SqlServerEndpointState.psm1} | 2 +- .../MSFT_SqlServerEndpointState.schema.mof} | 4 +- .../MSFT_SqlServerLogin.psm1} | 2 +- .../MSFT_SqlServerLogin.schema.mof} | 4 +- .../MSFT_SqlServerMaxDop.psm1} | 2 +- .../MSFT_SqlServerMaxDop.schema.mof} | 4 +- .../MSFT_SqlServerMemory.psm1} | 2 +- .../MSFT_SqlServerMemory.schema.mof} | 4 +- .../MSFT_SqlServerNetwork.psm1} | 4 +- .../MSFT_SqlServerNetwork.schema.mof} | 4 +- .../en-US/MSFT_SqlServerNetwork.strings.psd1} | 2 +- .../MSFT_SqlServerPermission.psm1} | 2 +- .../MSFT_SqlServerPermission.schema.mof} | 4 +- .../MSFT_SqlServerReplication.psm1} | 2 +- .../MSFT_SqlServerReplication.schema.mof} | 4 +- .../MSFT_SqlServerRole.psm1} | 2 +- .../MSFT_SqlServerRole.schema.mof} | 4 +- .../MSFT_SqlServerServiceAccount.psm1} | 4 +- .../MSFT_SqlServerServiceAccount.schema.mof} | 4 +- ...MSFT_xSQLServerServiceAccount.strings.psd1 | 2 +- .../MSFT_SqlSetup.psm1} | 4 +- .../MSFT_SqlSetup.schema.mof} | 4 +- .../en-US/MSFT_SqlSetup.strings.psd1} | 2 +- .../sv-SE/MSFT_SqlSetup.strings.psd1} | 2 +- .../MSFT_SqlWaitForAvailabilityGroup.psm1} | 2 +- ...FT_SqlWaitForAvailabilityGroup.schema.mof} | 4 +- .../MSFT_SqlWindowsFirewall.psm1} | 2 +- .../MSFT_SqlWindowsFirewall.schema.mof} | 4 +- Examples/DSCClusterSqlBuild.ps1 | 26 +- Examples/DSCFCISqlBuild.ps1 | 2 +- Examples/DSCSQLBuildEncrypted.ps1 | 6 +- Examples/DSCSqlBuild.ps1 | 8 +- .../1-CreateAvailabilityGroup.ps1 | 12 +- .../2-RemoveAvailabilityGroup.ps1 | 2 +- .../3-CreateAvailabilityGroupDetailed.ps1 | 12 +- .../1-AddDatabasesToAvailabilityGroup.ps1 | 16 +- ...2-RemoveDatabasesFromAvailabilityGroup.ps1 | 16 +- ...tchDefinedDatabasesInAvailabilityGroup.ps1 | 16 +- ...labilityGroupListenerWithSameNameAsVCO.ps1 | 2 +- ...ityGroupListenerWithDifferentNameAsVCO.ps1 | 2 +- ...labilityGroupListenerWithSameNameAsVCO.ps1 | 2 +- ...ityGroupListenerWithDifferentNameAsVCO.ps1 | 2 +- ...stenerUsingDHCPWithDefaultServerSubnet.ps1 | 2 +- ...oupListenerUsingDHCPWithSpecificSubnet.ps1 | 2 +- .../1-CreateAvailabilityGroupReplica.ps1 | 14 +- .../2-RemoveAvailabilityGroupReplica.ps1 | 14 +- .../1-AddSqlAlias.ps1} | 8 +- .../2-RemoveSqlAlias.ps1} | 6 +- .../1-EnableAlwaysOn.ps1 | 2 +- .../2-DisableAlwaysOn.ps1 | 2 +- .../1-CreateDatabase.ps1 | 4 +- .../2-DeleteDatabase.ps1 | 2 +- .../1-SetDatabaseDefaultLocation.ps1 | 6 +- .../1-SetDatabaseOwner.ps1 | 4 +- .../1-GrantDatabasePermissions.ps1 | 10 +- .../2-RevokeDatabasePermissions.ps1 | 4 +- .../3-DenyDatabasePermissions.ps1 | 10 +- .../1-SetDatabaseRecoveryModel.ps1 | 8 +- .../1-AddDatabaseRole.ps1 | 2 +- .../2-RemoveDatabaseRole.ps1 | 2 +- .../1-DefaultConfiguration.ps1 | 44 +- .../2-CustomConfiguration.ps1 | 62 +- .../1-RunScriptUsingSQLAuthentication.ps1 | 4 +- .../2-RunScriptUsingWindowsAuthentication.ps1 | 8 +- ...TwoInstancesOnTheSameServerToEnableClr.ps1 | 2 +- ...ConfigureInstanceToEnablePriorityBoost.ps1 | 2 +- .../1-CreateEndpointWithDefaultValues.ps1 | 6 +- ...teEndpointWithSpecificPortAndIPAddress.ps1 | 4 +- .../3-RemoveEndpoint.ps1 | 6 +- .../1-AddConnectPermission.ps1 | 4 +- .../2-RemoveConnectPermission.ps1 | 4 +- ...icaEachWithDifferentSqlServiceAccounts.ps1 | 10 +- ...icaEachWithDifferentSqlServiceAccounts.ps1 | 18 +- .../1-MakeSureEndpointIsStarted.ps1 | 8 +- .../2-MakeSureEndpointIsStopped.ps1 | 4 +- .../1-AddLogin.ps1 | 8 +- .../2-RemoveLogin.ps1 | 6 +- .../1-SetMaxDopToOne.ps1 | 2 +- .../2-SetMaxDopToAuto.ps1 | 2 +- .../3-SetMaxDopToDefault.ps1 | 2 +- .../1-SetMaxMemoryTo12GB.ps1 | 2 +- .../2-SetMaxMemoryToAuto.ps1 | 2 +- ...inMemoryToFixedValueAndMaxMemoryToAuto.ps1 | 2 +- .../4-SetMaxMemoryToDefault.ps1 | 2 +- .../1-EnableTcpIpWithStaticPort.ps1 | 2 +- .../2-EnableTcpIpWithDynamicPort.ps1 | 2 +- .../1-AddServerPermissionForLogin.ps1 | 6 +- .../2-RemoveServerPermissionForLogin.ps1 | 4 +- .../1-ConfigureInstanceAsDistributor.ps1 | 2 +- .../2-ConfigureInstanceAsPublisher.ps1 | 2 +- .../1-AddServerRole.ps1 | 2 +- .../2-RemoveServerRole.ps1 | 2 +- .../3-AddMembersToServerRole.ps1 | 2 +- .../4-MembersToIncludeInServerRole.ps1 | 2 +- .../5-MembersToExcludeInServerRole.ps1 | 2 +- .../1-ConfigureServiceAccount-UserAccount.ps1 | 2 +- ...ConfigureServiceAccount-VirtualAccount.ps1 | 2 +- .../1-InstallDefaultInstanceSingleServer.ps1 | 4 +- .../2-InstallNamedInstanceSingleServer.ps1 | 4 +- ...ServerFromUncPathUsingSourceCredential.ps1 | 4 +- ...amedInstanceInFailoverClusterFirstNode.ps1 | 4 +- ...medInstanceInFailoverClusterSecondNode.ps1 | 4 +- .../1-WaitForASingleClusterGroup.ps1 | 4 +- .../2-WaitForMultipleClusterGroups.ps1 | 6 +- .../1-CreateInboundFirewallRules.ps1 | 4 +- .../2-RemoveInboundFirewallRules.ps1 | 4 +- Examples/SQL-ClusterDB.ps1 | 6 +- Examples/SQL-Standalone.ps1 | 6 +- Examples/SQLPush_SingleServer.ps1 | 20 +- README.md | 343 +-- xSQLServer.psd1 => SQLServerDSC.psd1 | 0 ...rverHelper.psm1 => SqlServerDSCHelper.psm1 | 2 +- ..._SqlAlwaysOnService.Integration.Tests.ps1} | 4 +- ...ps1 => MSFT_SqlAlwaysOnService.config.ps1} | 12 +- ...baseDefaultLocation.Integration.Tests.ps1} | 4 +- ...SFT_SqlDatabaseDefaultLocation.config.ps1} | 18 +- ...s.ps1 => MSFT_SqlRS.Integration.Tests.ps1} | 4 +- ...onfig.config.ps1 => MSFT_SqlRS.config.ps1} | 10 +- ...s1 => MSFT_SqlSetup.Integration.Tests.ps1} | 4 +- ...up.config.ps1 => MSFT_SqlSetup.config.ps1} | 8 +- ...Tests.ps1 => SqlServerDSCCommon.Tests.ps1} | 6 +- ...tyGroup.Tests.ps1 => MSFT_SqlAG.Tests.ps1} | 14 +- ...ests.ps1 => MSFT_SqlAGDatabases.Tests.ps1} | 22 +- ...Tests.ps1 => MSFT_SqlAGListener.Tests.ps1} | 10 +- ....Tests.ps1 => MSFT_SqlAGReplica.Tests.ps1} | 12 +- ...lias.Tests.ps1 => MSFT_SqlAlias.Tests.ps1} | 4 +- ....ps1 => MSFT_SqlAlwaysOnService.Tests.ps1} | 4 +- ...e.Tests.ps1 => MSFT_SqlDatabase.Tests.ps1} | 10 +- ...MSFT_SqlDatabaseDefaultLocation.Tests.ps1} | 12 +- ...ts.ps1 => MSFT_SqlDatabaseOwner.Tests.ps1} | 606 ++--- ...1 => MSFT_SqlDatabasePermission.Tests.ps1} | 1720 +++++++------- ...> MSFT_SqlDatabaseRecoveryModel.Tests.ps1} | 10 +- ...sts.ps1 => MSFT_SqlDatabaseRole.Tests.ps1} | 10 +- ...SConfig.Tests.ps1 => MSFT_SqlRS.Tests.ps1} | 10 +- ...ipt.Tests.ps1 => MSFT_SqlScript.Tests.ps1} | 12 +- ... => MSFT_SqlServerConfiguration.Tests.ps1} | 4 +- ...s.ps1 => MSFT_SqlServerEndpoint.Tests.ps1} | 10 +- ...SFT_SqlServerEndpointPermission.Tests.ps1} | 10 +- ... => MSFT_SqlServerEndpointState.Tests.ps1} | 10 +- ...ests.ps1 => MSFT_SqlServerLogin.Tests.ps1} | 18 +- ...sts.ps1 => MSFT_SqlServerMaxDop.Tests.ps1} | 10 +- ...sts.ps1 => MSFT_SqlServerMemory.Tests.ps1} | 1556 ++++++------- ...ts.ps1 => MSFT_SqlServerNetwork.Tests.ps1} | 10 +- ...ps1 => MSFT_SqlServerPermission.Tests.ps1} | 10 +- ...s1 => MSFT_SqlServerReplication.Tests.ps1} | 4 +- ...Tests.ps1 => MSFT_SqlServerRole.Tests.ps1} | 2016 ++++++++--------- ...=> MSFT_SqlServerServiceAccount.Tests.ps1} | 14 +- ...etup.Tests.ps1 => MSFT_SqlSetup.Tests.ps1} | 10 +- ...SFT_SqlWaitForAvailabilityGroup.Tests.ps1} | 10 +- ....ps1 => MSFT_SqlWindowsFirewall.Tests.ps1} | 10 +- ...Tests.ps1 => SqlServerDSCHelper.Tests.ps1} | 8 +- Tests/Unit/Stubs/SMO.cs | 66 +- appveyor.yml | 2 +- ...s.psd1 => SqlServerDSCHelper.strings.psd1} | 2 +- ...s.psd1 => SqlServerDSCHelper.strings.psd1} | 2 +- xSQLServer.zip | Bin 404541 -> 0 bytes 200 files changed, 3737 insertions(+), 3726 deletions(-) rename DSCResources/{MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.psm1 => MSFT_SqlAG/MSFT_SqlAG.psm1} (99%) rename DSCResources/{MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.schema.mof => MSFT_SqlAG/MSFT_xSqlAG.schema.mof} (97%) rename DSCResources/{MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.psm1 => MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1} (99%) rename DSCResources/{MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.schema.mof => MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.schema.mof} (94%) rename DSCResources/{MSFT_xSQLServerAOAGDatabaseMembership/en-US/MSFT_xSQLServerAOAGDatabaseMembership.strings.psd1 => MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1} (94%) rename DSCResources/{MSFT_xSQLServerAOAGDatabaseMembership/en-US/about_xSQLServerAOAGDatabaseMembership.help.txt => MSFT_SqlAGDatabases/en-US/about_SqlAGDatabases.help.txt} (100%) rename DSCResources/{MSFT_xSQLServerAvailabilityGroupListener/MSFT_xSQLServerAvailabilityGroupListener.psm1 => MSFT_SqlAGListener/MSFT_SqlAGListener.psm1} (99%) rename DSCResources/{MSFT_xSQLServerAvailabilityGroupListener/MSFT_xSQLServerAvailabilityGroupListener.schema.mof => MSFT_SqlAGListener/MSFT_SqlAGListener.schema.mof} (89%) rename DSCResources/{MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.psm1 => MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1} (99%) rename DSCResources/{MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.schema.mof => MSFT_SqlAGReplica/MSFT_SqlAGReplica.schema.mof} (97%) rename DSCResources/{MSFT_xSQLServerAlias/MSFT_xSQLServerAlias.psm1 => MSFT_SqlAlias/MSFT_SqlAlias.psm1} (99%) rename DSCResources/{MSFT_xSQLServerAlias/MSFT_xSQLServerAlias.schema.mof => MSFT_SqlAlias/MSFT_SqlAlias.schema.mof} (90%) rename DSCResources/{MSFT_xSQLServerAlwaysOnService/MSFT_xSQLServerAlwaysOnService.psm1 => MSFT_SqlAlwaysOnService/MSFT_SqlAlwaysOnService.psm1} (99%) rename DSCResources/{MSFT_xSQLServerAlwaysOnService/MSFT_xSQLServerAlwaysOnService.schema.mof => MSFT_SqlAlwaysOnService/MSFT_SqlAlwaysOnService.schema.mof} (84%) rename DSCResources/{MSFT_xSQLServerDatabase/MSFT_xSQLServerDatabase.psm1 => MSFT_SqlDatabase/MSFT_SqlDatabase.psm1} (99%) rename DSCResources/{MSFT_xSQLServerDatabase/MSFT_xSQLServerDatabase.schema.mof => MSFT_SqlDatabase/MSFT_SqlDatabase.schema.mof} (85%) rename DSCResources/{MSFT_xSQLServerDatabaseDefaultLocation/MSFT_xSQLServerDatabaseDefaultLocation.psm1 => MSFT_SqlDatabaseDefaultLocation/MSFT_SqlDatabaseDefaultLocation.psm1} (98%) rename DSCResources/{MSFT_xSQLServerDatabaseDefaultLocation/MSFT_xSQLServerDatabaseDefaultLocation.schema.mof => MSFT_SqlDatabaseDefaultLocation/MSFT_SqlDatabaseDefaultLocation.schema.mof} (87%) rename DSCResources/{MSFT_xSQLServerDatabaseDefaultLocation/en-US/MSFT_xSQLServerDatabaseDefaultLocation.strings.psd1 => MSFT_SqlDatabaseDefaultLocation/en-US/MSFT_SqlDatabaseDefaultLocation.strings.psd1} (91%) rename DSCResources/{MSFT_xSQLServerDatabaseOwner/MSFT_xSQLServerDatabaseOwner.psm1 => MSFT_SqlDatabaseOwner/MSFT_SqlDatabaseOwner.psm1} (99%) rename DSCResources/{MSFT_xSQLServerDatabaseOwner/MSFT_xSQLServerDatabaseOwner.schema.mof => MSFT_SqlDatabaseOwner/MSFT_SqlDatabaseOwner.schema.mof} (76%) rename DSCResources/{MSFT_xSQLServerDatabasePermission/MSFT_xSQLServerDatabasePermission.psm1 => MSFT_SqlDatabasePermission/MSFT_SqlDatabasePermission.psm1} (99%) rename DSCResources/{MSFT_xSQLServerDatabasePermission/MSFT_xSQLServerDatabasePermission.schema.mof => MSFT_SqlDatabasePermission/MSFT_SqlDatabasePermission.schema.mof} (86%) rename DSCResources/{MSFT_xSQLServerDatabaseRecoveryModel/MSFT_xSQLServerDatabaseRecoveryModel.psm1 => MSFT_SqlDatabaseRecoveryModel/MSFT_SqlDatabaseRecoveryModel.psm1} (99%) rename DSCResources/{MSFT_xSQLServerDatabaseRecoveryModel/MSFT_xSQLServerDatabaseRecoveryModel.schema.mof => MSFT_SqlDatabaseRecoveryModel/MSFT_SqlDatabaseRecoveryModel.schema.mof} (76%) rename DSCResources/{MSFT_xSQLServerDatabaseRole/MSFT_xSQLServerDatabaseRole.psm1 => MSFT_SqlDatabaseRole/MSFT_SqlDatabaseRole.psm1} (99%) rename DSCResources/{MSFT_xSQLServerDatabaseRole/MSFT_xSQLServerDatabaseRole.schema.mof => MSFT_SqlDatabaseRole/MSFT_SqlDatabaseRole.schema.mof} (86%) rename DSCResources/{MSFT_xSQLServerRSConfig/MSFT_xSQLServerRSConfig.psm1 => MSFT_SqlRS/MSFT_SqlRS.psm1} (99%) rename DSCResources/{MSFT_xSQLServerRSConfig/MSFT_xSQLServerRSConfig.schema.mof => MSFT_SqlRS/MSFT_SqlRS.schema.mof} (90%) rename DSCResources/{MSFT_xSQLServerRSSecureConnectionLevel/MSFT_xSQLServerRSSecureConnectionLevel.psm1 => MSFT_SqlRSSecureConnectionLevel/MSFT_SqlRSSecureConnectionLevel.psm1} (97%) rename DSCResources/{MSFT_xSQLServerRSSecureConnectionLevel/MSFT_xSQLServerRSSecureConnectionLevel.schema.mof => MSFT_SqlRSSecureConnectionLevel/MSFT_SqlRSSecureConnectionLevel.schema.mof} (72%) rename DSCResources/{MSFT_xSQLServerScript/MSFT_xSQLServerScript.psm1 => MSFT_SqlScript/MSFT_SqlScript.psm1} (99%) rename DSCResources/{MSFT_xSQLServerScript/MSFT_xSQLServerScript.schema.mof => MSFT_SqlScript/MSFT_SqlScript.schema.mof} (95%) rename DSCResources/{MSFT_xSQLServerConfiguration/MSFT_xSQLServerConfiguration.psm1 => MSFT_SqlServerConfiguration/MSFT_SqlServerConfiguration.psm1} (99%) rename DSCResources/{MSFT_xSQLServerConfiguration/MSFT_xSQLServerConfiguration.schema.mof => MSFT_SqlServerConfiguration/MSFT_SqlServerConfiguration.schema.mof} (84%) rename DSCResources/{MSFT_xSQLServerEndpoint/MSFT_xSQLServerEndpoint.psm1 => MSFT_SqlServerEndpoint/MSFT_SqlServerEndpoint.psm1} (99%) rename DSCResources/{MSFT_xSQLServerEndpoint/MSFT_xSQLServerEndpoint.schema.mof => MSFT_SqlServerEndpoint/MSFT_SqlServerEndpoint.schema.mof} (87%) rename DSCResources/{MSFT_xSQLServerEndpointPermission/MSFT_xSQLServerEndpointPermission.psm1 => MSFT_SqlServerEndpointPermission/MSFT_SqlServerEndpointPermission.psm1} (99%) rename DSCResources/{MSFT_xSQLServerEndpointPermission/MSFT_xSQLServerEndpointPermission.schema.mof => MSFT_SqlServerEndpointPermission/MSFT_SqlServerEndpointPermission.schema.mof} (84%) rename DSCResources/{MSFT_xSQLServerEndpointState/MSFT_xSQLServerEndpointState.psm1 => MSFT_SqlServerEndpointState/MSFT_SqlServerEndpointState.psm1} (99%) rename DSCResources/{MSFT_xSQLServerEndpointState/MSFT_xSQLServerEndpointState.schema.mof => MSFT_SqlServerEndpointState/MSFT_SqlServerEndpointState.schema.mof} (81%) rename DSCResources/{MSFT_xSQLServerLogin/MSFT_xSQLServerLogin.psm1 => MSFT_SqlServerLogin/MSFT_SqlServerLogin.psm1} (99%) rename DSCResources/{MSFT_xSQLServerLogin/MSFT_xSQLServerLogin.schema.mof => MSFT_SqlServerLogin/MSFT_SqlServerLogin.schema.mof} (94%) rename DSCResources/{MSFT_xSQLServerMaxDop/MSFT_xSQLServerMaxDop.psm1 => MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.psm1} (96%) rename DSCResources/{MSFT_xSQLServerMaxDop/MSFT_xSQLServerMaxDop.schema.mof => MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.schema.mof} (92%) rename DSCResources/{MSFT_xSQLServerMemory/MSFT_xSQLServerMemory.psm1 => MSFT_SqlServerMemory/MSFT_SqlServerMemory.psm1} (99%) rename DSCResources/{MSFT_xSQLServerMemory/MSFT_xSQLServerMemory.schema.mof => MSFT_SqlServerMemory/MSFT_SqlServerMemory.schema.mof} (93%) rename DSCResources/{MSFT_xSQLServerNetwork/MSFT_xSQLServerNetwork.psm1 => MSFT_SqlServerNetwork/MSFT_SqlServerNetwork.psm1} (98%) rename DSCResources/{MSFT_xSQLServerNetwork/MSFT_xSQLServerNetwork.schema.mof => MSFT_SqlServerNetwork/MSFT_SqlServerNetwork.schema.mof} (92%) rename DSCResources/{MSFT_xSQLServerNetwork/en-US/MSFT_xSQLServerNetwork.strings.psd1 => MSFT_SqlServerNetwork/en-US/MSFT_SqlServerNetwork.strings.psd1} (93%) rename DSCResources/{MSFT_xSQLServerPermission/MSFT_xSQLServerPermission.psm1 => MSFT_SqlServerPermission/MSFT_SqlServerPermission.psm1} (99%) rename DSCResources/{MSFT_xSQLServerPermission/MSFT_xSQLServerPermission.schema.mof => MSFT_SqlServerPermission/MSFT_SqlServerPermission.schema.mof} (88%) rename DSCResources/{MSFT_xSQLServerReplication/MSFT_xSQLServerReplication.psm1 => MSFT_SqlServerReplication/MSFT_SqlServerReplication.psm1} (99%) rename DSCResources/{MSFT_xSQLServerReplication/MSFT_xSQLServerReplication.schema.mof => MSFT_SqlServerReplication/MSFT_SqlServerReplication.schema.mof} (88%) rename DSCResources/{MSFT_xSQLServerRole/MSFT_xSQLServerRole.psm1 => MSFT_SqlServerRole/MSFT_SqlServerRole.psm1} (99%) rename DSCResources/{MSFT_xSQLServerRole/MSFT_xSQLServerRole.schema.mof => MSFT_SqlServerRole/MSFT_SqlServerRole.schema.mof} (91%) rename DSCResources/{MSFT_xSQLServerServiceAccount/MSFT_xSQLServerServiceAccount.psm1 => MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.psm1} (98%) rename DSCResources/{MSFT_xSQLServerServiceAccount/MSFT_xSQLServerServiceAccount.schema.mof => MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.schema.mof} (88%) rename DSCResources/{MSFT_xSQLServerServiceAccount => MSFT_SqlServerServiceAccount}/en-US/MSFT_xSQLServerServiceAccount.strings.psd1 (92%) rename DSCResources/{MSFT_xSQLServerSetup/MSFT_xSQLServerSetup.psm1 => MSFT_SqlSetup/MSFT_SqlSetup.psm1} (99%) rename DSCResources/{MSFT_xSQLServerSetup/MSFT_xSQLServerSetup.schema.mof => MSFT_SqlSetup/MSFT_SqlSetup.schema.mof} (98%) rename DSCResources/{MSFT_xSQLServerSetup/en-US/MSFT_xSQLServerSetup.strings.psd1 => MSFT_SqlSetup/en-US/MSFT_SqlSetup.strings.psd1} (99%) rename DSCResources/{MSFT_xSQLServerSetup/sv-SE/MSFT_xSQLServerSetup.strings.psd1 => MSFT_SqlSetup/sv-SE/MSFT_SqlSetup.strings.psd1} (99%) rename DSCResources/{MSFT_xWaitForAvailabilityGroup/MSFT_xWaitForAvailabilityGroup.psm1 => MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.psm1} (99%) rename DSCResources/{MSFT_xWaitForAvailabilityGroup/MSFT_xWaitForAvailabilityGroup.schema.mof => MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.schema.mof} (84%) rename DSCResources/{MSFT_xSQLServerFirewall/MSFT_xSQLServerFirewall.psm1 => MSFT_SqlWindowsFirewall/MSFT_SqlWindowsFirewall.psm1} (99%) rename DSCResources/{MSFT_xSQLServerFirewall/MSFT_xSQLServerFirewall.schema.mof => MSFT_SqlWindowsFirewall/MSFT_SqlWindowsFirewall.schema.mof} (91%) rename Examples/Resources/{xSQLServerAlwaysOnAvailabilityGroup => SqlAG}/1-CreateAvailabilityGroup.ps1 (84%) rename Examples/Resources/{xSQLServerAlwaysOnAvailabilityGroup => SqlAG}/2-RemoveAvailabilityGroup.ps1 (94%) rename Examples/Resources/{xSQLServerAlwaysOnAvailabilityGroup => SqlAG}/3-CreateAvailabilityGroupDetailed.ps1 (90%) rename Examples/Resources/{xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership => SqlAGDatabases}/1-AddDatabasesToAvailabilityGroup.ps1 (87%) rename Examples/Resources/{xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership => SqlAGDatabases}/2-RemoveDatabasesFromAvailabilityGroup.ps1 (86%) rename Examples/Resources/{xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership => SqlAGDatabases}/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 (86%) rename Examples/Resources/{xSQLServerAvailabilityGroupListener => SqlAGListener}/1-AddAvailabilityGroupListenerWithSameNameAsVCO.ps1 (90%) rename Examples/Resources/{xSQLServerAvailabilityGroupListener => SqlAGListener}/2-AddAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 (90%) rename Examples/Resources/{xSQLServerAvailabilityGroupListener => SqlAGListener}/3-RemoveAvailabilityGroupListenerWithSameNameAsVCO.ps1 (88%) rename Examples/Resources/{xSQLServerAvailabilityGroupListener => SqlAGListener}/4-RemoveAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 (88%) rename Examples/Resources/{xSQLServerAvailabilityGroupListener => SqlAGListener}/5-AddAvailabilityGroupListenerUsingDHCPWithDefaultServerSubnet.ps1 (91%) rename Examples/Resources/{xSQLServerAvailabilityGroupListener => SqlAGListener}/6-AddAvailabilityGroupListenerUsingDHCPWithSpecificSubnet.ps1 (90%) rename Examples/Resources/{xSQLServerAlwaysOnAvailabilityGroupReplica => SqlAGReplica}/1-CreateAvailabilityGroupReplica.ps1 (88%) rename Examples/Resources/{xSQLServerAlwaysOnAvailabilityGroupReplica => SqlAGReplica}/2-RemoveAvailabilityGroupReplica.ps1 (87%) rename Examples/Resources/{xSQLServerAlias/1-AddSQLServerAlias.ps1 => SqlAlias/1-AddSqlAlias.ps1} (86%) rename Examples/Resources/{xSQLServerAlias/2-RemoveSQLServerAlias.ps1 => SqlAlias/2-RemoveSqlAlias.ps1} (86%) rename Examples/Resources/{xSQLServerAlwaysOnService => SqlAlwaysOnService}/1-EnableAlwaysOn.ps1 (92%) rename Examples/Resources/{xSQLServerAlwaysOnService => SqlAlwaysOnService}/2-DisableAlwaysOn.ps1 (92%) rename Examples/Resources/{xSQLServerDatabase => SqlDatabase}/1-CreateDatabase.ps1 (89%) rename Examples/Resources/{xSQLServerDatabase => SqlDatabase}/2-DeleteDatabase.ps1 (93%) rename Examples/Resources/{xSQLServerDatabaseDefaultLocation => SqlDatabaseDefaultLocation}/1-SetDatabaseDefaultLocation.ps1 (88%) rename Examples/Resources/{xSQLServerDatabaseOwner => SqlDatabaseOwner}/1-SetDatabaseOwner.ps1 (89%) rename Examples/Resources/{xSQLServerDatabasePermission => SqlDatabasePermission}/1-GrantDatabasePermissions.ps1 (86%) rename Examples/Resources/{xSQLServerDatabasePermission => SqlDatabasePermission}/2-RevokeDatabasePermissions.ps1 (88%) rename Examples/Resources/{xSQLServerDatabasePermission => SqlDatabasePermission}/3-DenyDatabasePermissions.ps1 (86%) rename Examples/Resources/{xSQLServerDatabaseRecoveryModel => SqlDatabaseRecoveryModel}/1-SetDatabaseRecoveryModel.ps1 (83%) rename Examples/Resources/{xSQLServerDatabaseRole => SqlDatabaseRole}/1-AddDatabaseRole.ps1 (94%) rename Examples/Resources/{xSQLServerDatabaseRole => SqlDatabaseRole}/2-RemoveDatabaseRole.ps1 (93%) rename Examples/Resources/{xSQLServerRSConfig => SqlRS}/1-DefaultConfiguration.ps1 (88%) rename Examples/Resources/{xSQLServerRSConfig => SqlRS}/2-CustomConfiguration.ps1 (92%) rename Examples/Resources/{xSQLServerScript => SqlScript}/1-RunScriptUsingSQLAuthentication.ps1 (88%) rename Examples/Resources/{xSQLServerScript => SqlScript}/2-RunScriptUsingWindowsAuthentication.ps1 (89%) rename Examples/Resources/{xSQLServerConfiguration => SqlServerConfiguration}/1-ConfigureTwoInstancesOnTheSameServerToEnableClr.ps1 (92%) rename Examples/Resources/{xSQLServerConfiguration => SqlServerConfiguration}/2-ConfigureInstanceToEnablePriorityBoost.ps1 (91%) rename Examples/Resources/{xSQLServerEndpoint => SqlServerEndpoint}/1-CreateEndpointWithDefaultValues.ps1 (80%) rename Examples/Resources/{xSQLServerEndpoint => SqlServerEndpoint}/2-CreateEndpointWithSpecificPortAndIPAddress.ps1 (88%) rename Examples/Resources/{xSQLServerEndpoint => SqlServerEndpoint}/3-RemoveEndpoint.ps1 (82%) rename Examples/Resources/{xSQLServerEndpointPermission => SqlServerEndpointPermission}/1-AddConnectPermission.ps1 (89%) rename Examples/Resources/{xSQLServerEndpointPermission => SqlServerEndpointPermission}/2-RemoveConnectPermission.ps1 (89%) rename Examples/Resources/{xSQLServerEndpointPermission => SqlServerEndpointPermission}/3-AddConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 (89%) rename Examples/Resources/{xSQLServerEndpointPermission => SqlServerEndpointPermission}/4-RemoveConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 (78%) rename Examples/Resources/{xSQLServerEndpointState => SqlServerEndpointState}/1-MakeSureEndpointIsStarted.ps1 (91%) rename Examples/Resources/{xSQLServerEndpointState => SqlServerEndpointState}/2-MakeSureEndpointIsStopped.ps1 (88%) rename Examples/Resources/{xSQLServerLogin => SqlServerLogin}/1-AddLogin.ps1 (92%) rename Examples/Resources/{xSQLServerLogin => SqlServerLogin}/2-RemoveLogin.ps1 (89%) rename Examples/Resources/{xSQLServerMaxDop => SqlServerMaxDop}/1-SetMaxDopToOne.ps1 (93%) rename Examples/Resources/{xSQLServerMaxDop => SqlServerMaxDop}/2-SetMaxDopToAuto.ps1 (95%) rename Examples/Resources/{xSQLServerMaxDop => SqlServerMaxDop}/3-SetMaxDopToDefault.ps1 (92%) rename Examples/Resources/{xSQLServerMemory => SqlServerMemory}/1-SetMaxMemoryTo12GB.ps1 (93%) rename Examples/Resources/{xSQLServerMemory => SqlServerMemory}/2-SetMaxMemoryToAuto.ps1 (94%) rename Examples/Resources/{xSQLServerMemory => SqlServerMemory}/3-SetMinMemoryToFixedValueAndMaxMemoryToAuto.ps1 (92%) rename Examples/Resources/{xSQLServerMemory => SqlServerMemory}/4-SetMaxMemoryToDefault.ps1 (91%) rename Examples/Resources/{xSQLServerNetwork => SqlServerNetwork}/1-EnableTcpIpWithStaticPort.ps1 (92%) rename Examples/Resources/{xSQLServerNetwork => SqlServerNetwork}/2-EnableTcpIpWithDynamicPort.ps1 (92%) rename Examples/Resources/{xSQLServerPermission => SqlServerPermission}/1-AddServerPermissionForLogin.ps1 (87%) rename Examples/Resources/{xSQLServerPermission => SqlServerPermission}/2-RemoveServerPermissionForLogin.ps1 (88%) rename Examples/Resources/{xSQLServerReplication => SqlServerReplication}/1-ConfigureInstanceAsDistributor.ps1 (94%) rename Examples/Resources/{xSQLServerReplication => SqlServerReplication}/2-ConfigureInstanceAsPublisher.ps1 (94%) rename Examples/Resources/{xSQLServerRole => SqlServerRole}/1-AddServerRole.ps1 (91%) rename Examples/Resources/{xSQLServerRole => SqlServerRole}/2-RemoveServerRole.ps1 (93%) rename Examples/Resources/{xSQLServerRole => SqlServerRole}/3-AddMembersToServerRole.ps1 (93%) rename Examples/Resources/{xSQLServerRole => SqlServerRole}/4-MembersToIncludeInServerRole.ps1 (93%) rename Examples/Resources/{xSQLServerRole => SqlServerRole}/5-MembersToExcludeInServerRole.ps1 (93%) rename Examples/Resources/{xSQLServerServiceAccount => SqlServerServiceAccount}/1-ConfigureServiceAccount-UserAccount.ps1 (90%) rename Examples/Resources/{xSQLServerServiceAccount => SqlServerServiceAccount}/2-ConfigureServiceAccount-VirtualAccount.ps1 (93%) rename Examples/Resources/{xSQLServerSetup => SqlSetup}/1-InstallDefaultInstanceSingleServer.ps1 (97%) rename Examples/Resources/{xSQLServerSetup => SqlSetup}/2-InstallNamedInstanceSingleServer.ps1 (97%) rename Examples/Resources/{xSQLServerSetup => SqlSetup}/3-InstallNamedInstanceSingleServerFromUncPathUsingSourceCredential.ps1 (97%) rename Examples/Resources/{xSQLServerSetup => SqlSetup}/4-InstallNamedInstanceInFailoverClusterFirstNode.ps1 (98%) rename Examples/Resources/{xSQLServerSetup => SqlSetup}/5-InstallNamedInstanceInFailoverClusterSecondNode.ps1 (97%) rename Examples/Resources/{xWaitForAvailabilityGroup => SqlWaitForAvailabilityGroup}/1-WaitForASingleClusterGroup.ps1 (82%) rename Examples/Resources/{xWaitForAvailabilityGroup => SqlWaitForAvailabilityGroup}/2-WaitForMultipleClusterGroups.ps1 (81%) rename Examples/Resources/{xSQLServerFirewall => SqlWindowsFirewall}/1-CreateInboundFirewallRules.ps1 (88%) rename Examples/Resources/{xSQLServerFirewall => SqlWindowsFirewall}/2-RemoveInboundFirewallRules.ps1 (88%) rename xSQLServer.psd1 => SQLServerDSC.psd1 (100%) rename xSQLServerHelper.psm1 => SqlServerDSCHelper.psm1 (99%) rename Tests/Integration/{MSFT_xSQLServerAlwaysOnService.Integration.Tests.ps1 => MSFT_SqlAlwaysOnService.Integration.Tests.ps1} (98%) rename Tests/Integration/{MSFT_xSQLServerAlwaysOnService.config.ps1 => MSFT_SqlAlwaysOnService.config.ps1} (94%) rename Tests/Integration/{MSFT_xSQLServerDatabaseDefaultLocation.Integration.Tests.ps1 => MSFT_SqlDatabaseDefaultLocation.Integration.Tests.ps1} (98%) rename Tests/Integration/{MSFT_xSQLServerDatabaseDefaultLocation.config.ps1 => MSFT_SqlDatabaseDefaultLocation.config.ps1} (86%) rename Tests/Integration/{MSFT_xSQLServerRSConfig.Integration.Tests.ps1 => MSFT_SqlRS.Integration.Tests.ps1} (98%) rename Tests/Integration/{MSFT_xSQLServerRSConfig.config.ps1 => MSFT_SqlRS.config.ps1} (93%) rename Tests/Integration/{MSFT_xSQLServerSetup.Integration.Tests.ps1 => MSFT_SqlSetup.Integration.Tests.ps1} (99%) rename Tests/Integration/{MSFT_xSQLServerSetup.config.ps1 => MSFT_SqlSetup.config.ps1} (95%) rename Tests/{xSQLServerCommon.Tests.ps1 => SqlServerDSCCommon.Tests.ps1} (94%) rename Tests/Unit/{MSFT_xSQLServerAlwaysOnAvailabilityGroup.Tests.ps1 => MSFT_SqlAG.Tests.ps1} (99%) rename Tests/Unit/{MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.Tests.ps1 => MSFT_SqlAGDatabases.Tests.ps1} (99%) rename Tests/Unit/{MSFT_xSQLServerAvailabilityGroupListener.Tests.ps1 => MSFT_SqlAGListener.Tests.ps1} (99%) rename Tests/Unit/{MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica.Tests.ps1 => MSFT_SqlAGReplica.Tests.ps1} (99%) rename Tests/Unit/{MSFT_xSQLServerAlias.Tests.ps1 => MSFT_SqlAlias.Tests.ps1} (99%) rename Tests/Unit/{MSFT_xSQLServerAlwaysOnService.Tests.ps1 => MSFT_SqlAlwaysOnService.Tests.ps1} (99%) rename Tests/Unit/{MSFT_xSQLServerDatabase.Tests.ps1 => MSFT_SqlDatabase.Tests.ps1} (98%) rename Tests/Unit/{MSFT_xSQLServerDatabaseDefaultLocation.Tests.ps1 => MSFT_SqlDatabaseDefaultLocation.Tests.ps1} (96%) rename Tests/Unit/{MSFT_xSQLServerDatabaseOwner.Tests.ps1 => MSFT_SqlDatabaseOwner.Tests.ps1} (95%) rename Tests/Unit/{MSFT_xSQLServerDatabasePermission.Tests.ps1 => MSFT_SqlDatabasePermission.Tests.ps1} (97%) rename Tests/Unit/{MSFT_xSQLServerDatabaseRecoveryModel.Tests.ps1 => MSFT_SqlDatabaseRecoveryModel.Tests.ps1} (96%) rename Tests/Unit/{MSFT_xSQLServerDatabaseRole.Tests.ps1 => MSFT_SqlDatabaseRole.Tests.ps1} (99%) rename Tests/Unit/{MSFT_xSQLServerRSConfig.Tests.ps1 => MSFT_SqlRS.Tests.ps1} (99%) rename Tests/Unit/{MSFT_xSQLServerScript.Tests.ps1 => MSFT_SqlScript.Tests.ps1} (97%) rename Tests/Unit/{MSFT_xSQLServerConfiguration.Tests.ps1 => MSFT_SqlServerConfiguration.Tests.ps1} (99%) rename Tests/Unit/{MSFT_xSQLServerEndpoint.Tests.ps1 => MSFT_SqlServerEndpoint.Tests.ps1} (98%) rename Tests/Unit/{MSFT_xSQLServerEndpointPermission.Tests.ps1 => MSFT_SqlServerEndpointPermission.Tests.ps1} (97%) rename Tests/Unit/{MSFT_xSQLServerEndpointState.Tests.ps1 => MSFT_SqlServerEndpointState.Tests.ps1} (97%) rename Tests/Unit/{MSFT_xSQLServerLogin.Tests.ps1 => MSFT_SqlServerLogin.Tests.ps1} (99%) rename Tests/Unit/{MSFT_xSQLServerMaxDop.Tests.ps1 => MSFT_SqlServerMaxDop.Tests.ps1} (98%) rename Tests/Unit/{MSFT_xSQLServerMemory.Tests.ps1 => MSFT_SqlServerMemory.Tests.ps1} (96%) rename Tests/Unit/{MSFT_xSQLServerNetwork.Tests.ps1 => MSFT_SqlServerNetwork.Tests.ps1} (98%) rename Tests/Unit/{MSFT_xSQLServerPermission.Tests.ps1 => MSFT_SqlServerPermission.Tests.ps1} (97%) rename Tests/Unit/{MSFT_xSQLServerReplication.Tests.ps1 => MSFT_SqlServerReplication.Tests.ps1} (99%) rename Tests/Unit/{MSFT_xSQLServerRole.Tests.ps1 => MSFT_SqlServerRole.Tests.ps1} (97%) rename Tests/Unit/{MSFT_xSQLServerServiceAccount.Tests.ps1 => MSFT_SqlServerServiceAccount.Tests.ps1} (98%) rename Tests/Unit/{MSFT_xSQLServerSetup.Tests.ps1 => MSFT_SqlSetup.Tests.ps1} (99%) rename Tests/Unit/{MSFT_xWaitForAvailabilityGroup.Tests.ps1 => MSFT_SqlWaitForAvailabilityGroup.Tests.ps1} (96%) rename Tests/Unit/{MSFT_xSQLServerFirewall.Tests.ps1 => MSFT_SqlWindowsFirewall.Tests.ps1} (99%) rename Tests/Unit/{xSQLServerHelper.Tests.ps1 => SqlServerDSCHelper.Tests.ps1} (99%) rename en-US/{xSQLServerHelper.strings.psd1 => SqlServerDSCHelper.strings.psd1} (99%) rename sv-SE/{xSQLServerHelper.strings.psd1 => SqlServerDSCHelper.strings.psd1} (99%) delete mode 100644 xSQLServer.zip diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 0c13825d3..37a3b368b 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,7 +1,7 @@ **Pull Request (PR) description** diff --git a/CHANGELOG.md b/CHANGELOG.md index 5955ccd51..db2d779d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +- Significant rename to reduce length of Resource names + - BREAKING CHANGE + - Impact to all resources + ## 9.0.0.0 - Changes to xSQLServer diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c21594bcc..65c7ca846 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ -# Contributing to xSQLServer +# Contributing to SqlServerDSC -If you are keen to make xSQLServer better, why not consider contributing your work +If you are keen to make SqlServerDSC better, why not consider contributing your work to the project? Every little change helps us make a better resource for everyone to use, and we would love to have contributions from the community. @@ -10,7 +10,7 @@ We follow all of the standard contribution guidelines for DSC resources [outlined in DscResources repository](https://github.com/PowerShell/DscResources/blob/master/CONTRIBUTING.md), so please review these as a baseline for contributing. -## xSQLServer specific guidelines +## SqlServerDSC specific guidelines ### Automatic formatting with VS Code @@ -37,7 +37,7 @@ Those SQL Server products that are still supported can be listed at the #### mof-based resource All mof-based resource (with Get/Set/Test-TargetResource) should be prefixed with -'MSFT\_xSQLServer'. I.e. MSFT\_xSQLServerConfiguration +'MSFT\_SqlServer'. I.e. MSFT\_SqlServerConfiguration Please note that not all places should contain the prefix 'MSFT\_'. @@ -49,14 +49,14 @@ This is to make those folders more user friendly, to resemble the name the user would use in the configuration file. ```Text -DSCResources/MSFT_xSQLServerConfiguration/MSFT_xSQLServerConfiguration.psm1 -DSCResources/MSFT_xSQLServerConfiguration/MSFT_xSQLServerConfiguration.schema.mof -DSCResources/MSFT_xSQLServerConfiguration/en-US/MSFT_xSQLServerConfiguration.strings.psd1 +DSCResources/MSFT_SqlServerConfiguration/MSFT_SqlServerConfiguration.psm1 +DSCResources/MSFT_SqlServerConfiguration/MSFT_SqlServerConfiguration.schema.mof +DSCResources/MSFT_SqlServerConfiguration/en-US/MSFT_SqlServerConfiguration.strings.psd1 -Tests/Unit/MSFT_xSQLServerConfiguration.Tests.ps1 +Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 -Examples/Resources/xSQLServerConfiguration/1-AddConfigurationOption.ps1 -Examples/Resources/xSQLServerConfiguration/2-RemoveConfigurationOption.ps1 +Examples/Resources/SqlServerConfiguration/1-AddConfigurationOption.ps1 +Examples/Resources/SqlServerConfiguration/2-RemoveConfigurationOption.ps1 ``` ##### Schema mof file @@ -65,8 +65,8 @@ Please note that the `FriendlyName` in the schema mof file should not contain th prefix `MSFT\_`. ```powershell -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerConfiguration")] -class MSFT_xSQLServerConfiguration : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlServerConfiguration")] +class MSFT_SqlServerConfiguration : OMI_BaseResource { # Properties removed for readability. }; @@ -75,7 +75,7 @@ class MSFT_xSQLServerConfiguration : OMI_BaseResource #### Composite or class-based resource Any composite (with a Configuration) or class-based resources should be prefixed -with just 'xSQLServer' +with just 'Sql' ### Localization @@ -87,7 +87,7 @@ In each resource folder there should be, at least, a localization folder for english language 'en-US'. In the 'en-US' (and any other language folder) there should be a file named 'MSFT_ResourceName.strings.psd1', i.e. -'MSFT_xSQLServerSetup.strings.psd1'. +'MSFT_SqlSetup.strings.psd1'. At the top of each resource the localized strings should be loaded, see the helper function `Get-LocalizedData` for more information on how this is done. @@ -95,7 +95,7 @@ The localized string file should contain the following (beside the localization strings) ```powershell -# Localized resources for xSQLServerSetup +# Localized resources for SqlSetup ConvertFrom-StringData @' InstallingUsingPathMessage = Installing using path '{0}'. @@ -272,7 +272,7 @@ This should be used at the top of each resource like this. Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` -ChildPath 'CommonResourceHelper.psm1') -$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_xSQLServerSetup' +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlSetup' ``` #### Old localization helper function @@ -280,7 +280,7 @@ $script:localizedData = Get-LocalizedData -ResourceName 'MSFT_xSQLServerSetup' To be able to support localization we have added wrappers for the cmdlets `Write-Verbose` and `Write-Warning`, and also for creating a terminating error message. -The localized strings are placed in a file named 'xSQLServerHelper.strings.psd1' +The localized strings are placed in a file named 'SqlServerDSCHelper.strings.psd1' which are located in each language folder in the root of the module. For English language strings the folder is ['en-US'](https://github.com/PowerShell/xSQLServer/blob/dev/en-US). @@ -305,7 +305,7 @@ Helper functions or wrapper functions that are used by the resource can preferab be placed in the resource module file. If the functions are of a type that could be used by more than one resource, then the functions can also be placed in the common -[xSQLServerHelper.psm1](https://github.com/PowerShell/xSQLServer/blob/dev/xSQLServerHelper.psm1) +[SqlServerDSCHelper.psm1](https://github.com/PowerShell/xSQLServer/blob/dev/SqlServerDSCHelper.psm1) module file. ### Tests @@ -340,12 +340,12 @@ When sending in a Pull Request (PR) all example files will be tested so they can be compiled to a .mof file. If the tests find any errors the build will fail. Before the test runs in AppVeyor the module will be copied to the first path of `$env:PSModulePath`. -To run this test locally, make sure you have the xSQLServer module deployed to a +To run this test locally, make sure you have the SqlServerDSC module deployed to a path where it can be used. See `$env:PSModulePath` to view the existing paths. #### Using SMO stub classes -There are [stub classes](https://github.com/PowerShell/xSQLServer/blob/dev/Tests/Unit/Stubs/SMO.cs) +There are [stub classes](https://github.com/PowerShell/SqlServerDSC/blob/dev/Tests/Unit/Stubs/SMO.cs) for the SMO classes which can be used and improved on when creating tests where SMO classes are used in the code being tested. diff --git a/DSCResources/CommonResourceHelper.psm1 b/DSCResources/CommonResourceHelper.psm1 index 61e4f7676..33c387a67 100644 --- a/DSCResources/CommonResourceHelper.psm1 +++ b/DSCResources/CommonResourceHelper.psm1 @@ -204,7 +204,7 @@ function New-InvalidResultException For WindowsOptionalFeature: MSFT_WindowsOptionalFeature For Service: MSFT_ServiceResource For Registry: MSFT_RegistryResource - For Helper: xSQLServerHelper + For Helper: SqlServerHelper .PARAMETER ScriptRoot Optional. The root path where to expect to find the culture folder. This is only needed diff --git a/DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.psm1 b/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.psm1 rename to DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1 index 1c87a2bb6..5997d0b69 100644 --- a/DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.psm1 +++ b/DSCResources/MSFT_SqlAG/MSFT_SqlAG.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# diff --git a/DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.schema.mof b/DSCResources/MSFT_SqlAG/MSFT_xSqlAG.schema.mof similarity index 97% rename from DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.schema.mof rename to DSCResources/MSFT_SqlAG/MSFT_xSqlAG.schema.mof index 521516263..487516fd8 100644 --- a/DSCResources/MSFT_xSQLServerAOAG/MSFT_xSQLServerAOAG.schema.mof +++ b/DSCResources/MSFT_SqlAG/MSFT_xSqlAG.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerAOAG")] -class MSFT_xSQLServerAOAG : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlAG")] +class MSFT_SqlAG : OMI_BaseResource { [Key, Description("The name of the availability group.")] String Name; [Required, Description("Hostname of the SQL Server to be configured.")] String SQLServer; diff --git a/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.psm1 b/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.psm1 rename to DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 index b86c1a5aa..87e68014a 100644 --- a/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.psm1 +++ b/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.psm1 @@ -1,11 +1,11 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` -ChildPath 'CommonResourceHelper.psm1') -$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_xSQLServerAOAGDatabaseMembership' +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlServerAGDatabaseMembership' <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.schema.mof b/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.schema.mof similarity index 94% rename from DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.schema.mof rename to DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.schema.mof index 81ff59ecc..795e6c729 100644 --- a/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/MSFT_xSQLServerAOAGDatabaseMembership.schema.mof +++ b/DSCResources/MSFT_SqlAGDatabases/MSFT_SqlAGDatabases.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerAOAGDatabaseMembership")] -class MSFT_xSQLServerAOAGDatabaseMembership : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlAGDatabases")] +class MSFT_SqlAGDatabases : OMI_BaseResource { [Required, Description("The name of the database(s) to add to the availability group. This accepts wildcards.")] String DatabaseName[]; [Key, Description("Hostname of the SQL Server where the primary replica of the availability group lives. If the availability group is not currently on this server, the resource will attempt to connect to the server where the primary replica lives.")] String SQLServer; diff --git a/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/MSFT_xSQLServerAOAGDatabaseMembership.strings.psd1 b/DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 similarity index 94% rename from DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/MSFT_xSQLServerAOAGDatabaseMembership.strings.psd1 rename to DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 index e6f7ca437..874289645 100644 --- a/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/MSFT_xSQLServerAOAGDatabaseMembership.strings.psd1 +++ b/DSCResources/MSFT_SqlAGDatabases/en-US/MSFT_SqlAGDatabases.strings.psd1 @@ -1,4 +1,4 @@ -# Localized resources for xSQLServerAOAGDatabaseMembership +# Localized resources for SqlServerAGDatabaseMembership ConvertFrom-StringData @' AddingDatabasesToAvailabilityGroup = Adding the following databases to the '{0}' availability group: {1}. diff --git a/DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/about_xSQLServerAOAGDatabaseMembership.help.txt b/DSCResources/MSFT_SqlAGDatabases/en-US/about_SqlAGDatabases.help.txt similarity index 100% rename from DSCResources/MSFT_xSQLServerAOAGDatabaseMembership/en-US/about_xSQLServerAOAGDatabaseMembership.help.txt rename to DSCResources/MSFT_SqlAGDatabases/en-US/about_SqlAGDatabases.help.txt diff --git a/DSCResources/MSFT_xSQLServerAvailabilityGroupListener/MSFT_xSQLServerAvailabilityGroupListener.psm1 b/DSCResources/MSFT_SqlAGListener/MSFT_SqlAGListener.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerAvailabilityGroupListener/MSFT_xSQLServerAvailabilityGroupListener.psm1 rename to DSCResources/MSFT_SqlAGListener/MSFT_SqlAGListener.psm1 index fd0b2e382..3fcfe1a18 100644 --- a/DSCResources/MSFT_xSQLServerAvailabilityGroupListener/MSFT_xSQLServerAvailabilityGroupListener.psm1 +++ b/DSCResources/MSFT_SqlAGListener/MSFT_SqlAGListener.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerAvailabilityGroupListener/MSFT_xSQLServerAvailabilityGroupListener.schema.mof b/DSCResources/MSFT_SqlAGListener/MSFT_SqlAGListener.schema.mof similarity index 89% rename from DSCResources/MSFT_xSQLServerAvailabilityGroupListener/MSFT_xSQLServerAvailabilityGroupListener.schema.mof rename to DSCResources/MSFT_SqlAGListener/MSFT_SqlAGListener.schema.mof index 29c9c83df..43c13e8fe 100644 --- a/DSCResources/MSFT_xSQLServerAvailabilityGroupListener/MSFT_xSQLServerAvailabilityGroupListener.schema.mof +++ b/DSCResources/MSFT_SqlAGListener/MSFT_SqlAGListener.schema.mof @@ -1,6 +1,6 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerAvailabilityGroupListener")] -class MSFT_xSQLServerAvailabilityGroupListener : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlAGListener")] +class MSFT_SqlAGListener : OMI_BaseResource { [Key, Description("The SQL Server instance name of the primary replica.")] String InstanceName; [Required, Description("The host name or FQDN of the primary replica.")] String NodeName; diff --git a/DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.psm1 b/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.psm1 rename to DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1 index 1aba2bbf2..1a4c4e17c 100644 --- a/DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.psm1 +++ b/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# diff --git a/DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.schema.mof b/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.schema.mof similarity index 97% rename from DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.schema.mof rename to DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.schema.mof index 6b9a4d5b0..46127e6eb 100644 --- a/DSCResources/MSFT_xSQLServerAOAGReplica/MSFT_xSQLServerAOAGReplica.schema.mof +++ b/DSCResources/MSFT_SqlAGReplica/MSFT_SqlAGReplica.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerAOAGReplica")] -class MSFT_xSQLServerAOAGReplica : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlAGReplica")] +class MSFT_SqlAGReplica : OMI_BaseResource { [Key, Description("The name of the availability group replica. For named instances this must be in the following format SQLServer\\InstanceName.")] String Name; [Key, Description("The name of the availability group.")] String AvailabilityGroupName; diff --git a/DSCResources/MSFT_xSQLServerAlias/MSFT_xSQLServerAlias.psm1 b/DSCResources/MSFT_SqlAlias/MSFT_SqlAlias.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerAlias/MSFT_xSQLServerAlias.psm1 rename to DSCResources/MSFT_SqlAlias/MSFT_SqlAlias.psm1 index 4f7aac8f4..1b71a5753 100644 --- a/DSCResources/MSFT_xSQLServerAlias/MSFT_xSQLServerAlias.psm1 +++ b/DSCResources/MSFT_SqlAlias/MSFT_SqlAlias.psm1 @@ -1,4 +1,4 @@ -Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) -ChildPath 'xSQLServerHelper.psm1') -Force +Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) -ChildPath 'SqlServerDSCHelper.psm1') -Force function Get-TargetResource { diff --git a/DSCResources/MSFT_xSQLServerAlias/MSFT_xSQLServerAlias.schema.mof b/DSCResources/MSFT_SqlAlias/MSFT_SqlAlias.schema.mof similarity index 90% rename from DSCResources/MSFT_xSQLServerAlias/MSFT_xSQLServerAlias.schema.mof rename to DSCResources/MSFT_SqlAlias/MSFT_SqlAlias.schema.mof index 241daec8e..d410ae257 100644 --- a/DSCResources/MSFT_xSQLServerAlias/MSFT_xSQLServerAlias.schema.mof +++ b/DSCResources/MSFT_SqlAlias/MSFT_SqlAlias.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerAlias")] -class MSFT_xSQLServerAlias : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SQLAlias")] +class MSFT_SQLAlias : OMI_BaseResource { [Key, Description("The name of Alias (e.g. svr01\\inst01).")] String Name; [Write, Description("Protocol to use when connecting. Valid values are 'TCP' or 'NP' (Named Pipes). Default value is 'TCP'."), ValueMap{"TCP","NP"}, Values{"TCP","NP"}] String Protocol; diff --git a/DSCResources/MSFT_xSQLServerAlwaysOnService/MSFT_xSQLServerAlwaysOnService.psm1 b/DSCResources/MSFT_SqlAlwaysOnService/MSFT_SqlAlwaysOnService.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerAlwaysOnService/MSFT_xSQLServerAlwaysOnService.psm1 rename to DSCResources/MSFT_SqlAlwaysOnService/MSFT_SqlAlwaysOnService.psm1 index 1e1b509de..aeaed1b57 100644 --- a/DSCResources/MSFT_xSQLServerAlwaysOnService/MSFT_xSQLServerAlwaysOnService.psm1 +++ b/DSCResources/MSFT_SqlAlwaysOnService/MSFT_SqlAlwaysOnService.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# diff --git a/DSCResources/MSFT_xSQLServerAlwaysOnService/MSFT_xSQLServerAlwaysOnService.schema.mof b/DSCResources/MSFT_SqlAlwaysOnService/MSFT_SqlAlwaysOnService.schema.mof similarity index 84% rename from DSCResources/MSFT_xSQLServerAlwaysOnService/MSFT_xSQLServerAlwaysOnService.schema.mof rename to DSCResources/MSFT_SqlAlwaysOnService/MSFT_SqlAlwaysOnService.schema.mof index 6c46028ee..831fd4b7d 100644 --- a/DSCResources/MSFT_xSQLServerAlwaysOnService/MSFT_xSQLServerAlwaysOnService.schema.mof +++ b/DSCResources/MSFT_SqlAlwaysOnService/MSFT_SqlAlwaysOnService.schema.mof @@ -1,9 +1,9 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerAlwaysOnService")] -class MSFT_xSQLServerAlwaysOnService : OMI_BaseResource -{ - [Required, Description("An enumerated value that describes if the SQL Server should have Always On high availability and disaster recovery (HADR) property enabled ('Present') or disabled ('Absent')."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; - [Key, Description("The hostname of the SQL Server to be configured.")] String SQLServer; - [Key, Description("The name of the SQL instance to be configured.")] String SQLInstanceName; - [Write, Description("The length of time, in seconds, to wait for the service to restart. Default is 120 seconds.")] Uint32 RestartTimeout; - [Read, Description("Returns the status of AlwaysOn high availability and disaster recovery (HADR).")] Boolean IsHadrEnabled; -}; +[ClassVersion("1.0.0.0"), FriendlyName("SqlAlwaysOnService")] +class MSFT_SqlAlwaysOnService : OMI_BaseResource +{ + [Required, Description("An enumerated value that describes if the SQL Server should have Always On high availability and disaster recovery (HADR) property enabled ('Present') or disabled ('Absent')."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Key, Description("The hostname of the SQL Server to be configured.")] String SQLServer; + [Key, Description("The name of the SQL instance to be configured.")] String SQLInstanceName; + [Write, Description("The length of time, in seconds, to wait for the service to restart. Default is 120 seconds.")] Uint32 RestartTimeout; + [Read, Description("Returns the status of AlwaysOn high availability and disaster recovery (HADR).")] Boolean IsHadrEnabled; +}; diff --git a/DSCResources/MSFT_xSQLServerDatabase/MSFT_xSQLServerDatabase.psm1 b/DSCResources/MSFT_SqlDatabase/MSFT_SqlDatabase.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerDatabase/MSFT_xSQLServerDatabase.psm1 rename to DSCResources/MSFT_SqlDatabase/MSFT_SqlDatabase.psm1 index c57be31e7..80328613e 100644 --- a/DSCResources/MSFT_xSQLServerDatabase/MSFT_xSQLServerDatabase.psm1 +++ b/DSCResources/MSFT_SqlDatabase/MSFT_SqlDatabase.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerDatabase/MSFT_xSQLServerDatabase.schema.mof b/DSCResources/MSFT_SqlDatabase/MSFT_SqlDatabase.schema.mof similarity index 85% rename from DSCResources/MSFT_xSQLServerDatabase/MSFT_xSQLServerDatabase.schema.mof rename to DSCResources/MSFT_SqlDatabase/MSFT_SqlDatabase.schema.mof index 67b6e6f29..4539ea4cc 100644 --- a/DSCResources/MSFT_xSQLServerDatabase/MSFT_xSQLServerDatabase.schema.mof +++ b/DSCResources/MSFT_SqlDatabase/MSFT_SqlDatabase.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerDatabase")] -class MSFT_xSQLServerDatabase : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlDatabase")] +class MSFT_SqlDatabase : OMI_BaseResource { [Key, Description("The name of the SQL database.")] String Name; [Write, Description("An enumerated value that describes if the database is added (Present) or dropped (Absent). Valid values are 'Present' or 'Absent'. Default Value is 'Present'."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; diff --git a/DSCResources/MSFT_xSQLServerDatabaseDefaultLocation/MSFT_xSQLServerDatabaseDefaultLocation.psm1 b/DSCResources/MSFT_SqlDatabaseDefaultLocation/MSFT_SqlDatabaseDefaultLocation.psm1 similarity index 98% rename from DSCResources/MSFT_xSQLServerDatabaseDefaultLocation/MSFT_xSQLServerDatabaseDefaultLocation.psm1 rename to DSCResources/MSFT_SqlDatabaseDefaultLocation/MSFT_SqlDatabaseDefaultLocation.psm1 index 1327685ca..9a89643df 100644 --- a/DSCResources/MSFT_xSQLServerDatabaseDefaultLocation/MSFT_xSQLServerDatabaseDefaultLocation.psm1 +++ b/DSCResources/MSFT_SqlDatabaseDefaultLocation/MSFT_SqlDatabaseDefaultLocation.psm1 @@ -1,11 +1,11 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` -ChildPath 'CommonResourceHelper.psm1') -$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_xSQLServerDatabaseDefaultLocation' +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlDatabaseDefaultLocation' <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerDatabaseDefaultLocation/MSFT_xSQLServerDatabaseDefaultLocation.schema.mof b/DSCResources/MSFT_SqlDatabaseDefaultLocation/MSFT_SqlDatabaseDefaultLocation.schema.mof similarity index 87% rename from DSCResources/MSFT_xSQLServerDatabaseDefaultLocation/MSFT_xSQLServerDatabaseDefaultLocation.schema.mof rename to DSCResources/MSFT_SqlDatabaseDefaultLocation/MSFT_SqlDatabaseDefaultLocation.schema.mof index 5d78b6822..3b909829f 100644 --- a/DSCResources/MSFT_xSQLServerDatabaseDefaultLocation/MSFT_xSQLServerDatabaseDefaultLocation.schema.mof +++ b/DSCResources/MSFT_SqlDatabaseDefaultLocation/MSFT_SqlDatabaseDefaultLocation.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerDatabaseDefaultLocation")] -class MSFT_xSQLServerDatabaseDefaultLocation : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlDatabaseDefaultLocation")] +class MSFT_SqlDatabaseDefaultLocation : OMI_BaseResource { [Key, Description("The host name of the SQL Server to be configured.")] String SQLServer; [Key, Description("The name of the SQL instance to be configured.")] String SQLInstanceName; diff --git a/DSCResources/MSFT_xSQLServerDatabaseDefaultLocation/en-US/MSFT_xSQLServerDatabaseDefaultLocation.strings.psd1 b/DSCResources/MSFT_SqlDatabaseDefaultLocation/en-US/MSFT_SqlDatabaseDefaultLocation.strings.psd1 similarity index 91% rename from DSCResources/MSFT_xSQLServerDatabaseDefaultLocation/en-US/MSFT_xSQLServerDatabaseDefaultLocation.strings.psd1 rename to DSCResources/MSFT_SqlDatabaseDefaultLocation/en-US/MSFT_SqlDatabaseDefaultLocation.strings.psd1 index ac3fdf9ce..ee9cf93cd 100644 --- a/DSCResources/MSFT_xSQLServerDatabaseDefaultLocation/en-US/MSFT_xSQLServerDatabaseDefaultLocation.strings.psd1 +++ b/DSCResources/MSFT_SqlDatabaseDefaultLocation/en-US/MSFT_SqlDatabaseDefaultLocation.strings.psd1 @@ -1,4 +1,4 @@ -# Localized resources for MSFT_xSQLServerDatabaseDefaultLocation +# Localized resources for MSFT_SqlDatabaseDefaultLocation ConvertFrom-StringData @' GetCurrentPath = Getting default path for '{0}' for instance '{1}'. diff --git a/DSCResources/MSFT_xSQLServerDatabaseOwner/MSFT_xSQLServerDatabaseOwner.psm1 b/DSCResources/MSFT_SqlDatabaseOwner/MSFT_SqlDatabaseOwner.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerDatabaseOwner/MSFT_xSQLServerDatabaseOwner.psm1 rename to DSCResources/MSFT_SqlDatabaseOwner/MSFT_SqlDatabaseOwner.psm1 index 271e4a836..1ccf08fef 100644 --- a/DSCResources/MSFT_xSQLServerDatabaseOwner/MSFT_xSQLServerDatabaseOwner.psm1 +++ b/DSCResources/MSFT_SqlDatabaseOwner/MSFT_SqlDatabaseOwner.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerDatabaseOwner/MSFT_xSQLServerDatabaseOwner.schema.mof b/DSCResources/MSFT_SqlDatabaseOwner/MSFT_SqlDatabaseOwner.schema.mof similarity index 76% rename from DSCResources/MSFT_xSQLServerDatabaseOwner/MSFT_xSQLServerDatabaseOwner.schema.mof rename to DSCResources/MSFT_SqlDatabaseOwner/MSFT_SqlDatabaseOwner.schema.mof index 552d22629..1d970c749 100644 --- a/DSCResources/MSFT_xSQLServerDatabaseOwner/MSFT_xSQLServerDatabaseOwner.schema.mof +++ b/DSCResources/MSFT_SqlDatabaseOwner/MSFT_SqlDatabaseOwner.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerDatabaseOwner")] -class MSFT_xSQLServerDatabaseOwner : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlDatabaseOwner")] +class MSFT_SqlDatabaseOwner : OMI_BaseResource { [Key, Description("The name of database to be configured.")] String Database; [Required, Description("The name of the login that will become a owner of the desired sql database.")] String Name; diff --git a/DSCResources/MSFT_xSQLServerDatabasePermission/MSFT_xSQLServerDatabasePermission.psm1 b/DSCResources/MSFT_SqlDatabasePermission/MSFT_SqlDatabasePermission.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerDatabasePermission/MSFT_xSQLServerDatabasePermission.psm1 rename to DSCResources/MSFT_SqlDatabasePermission/MSFT_SqlDatabasePermission.psm1 index 684fe53ef..ac1f6a8bd 100644 --- a/DSCResources/MSFT_xSQLServerDatabasePermission/MSFT_xSQLServerDatabasePermission.psm1 +++ b/DSCResources/MSFT_SqlDatabasePermission/MSFT_SqlDatabasePermission.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerDatabasePermission/MSFT_xSQLServerDatabasePermission.schema.mof b/DSCResources/MSFT_SqlDatabasePermission/MSFT_SqlDatabasePermission.schema.mof similarity index 86% rename from DSCResources/MSFT_xSQLServerDatabasePermission/MSFT_xSQLServerDatabasePermission.schema.mof rename to DSCResources/MSFT_SqlDatabasePermission/MSFT_SqlDatabasePermission.schema.mof index 01c4b8cb8..03547b21a 100644 --- a/DSCResources/MSFT_xSQLServerDatabasePermission/MSFT_xSQLServerDatabasePermission.schema.mof +++ b/DSCResources/MSFT_SqlDatabasePermission/MSFT_SqlDatabasePermission.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerDatabasePermission")] -class MSFT_xSQLServerDatabasePermission : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlDatabasePermission")] +class MSFT_SqlDatabasePermission : OMI_BaseResource { [Write, Description("If the values should be present or absent. Valid values are 'Present' or 'Absent'."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; [Key, Description("The name of the database.")] String Database; diff --git a/DSCResources/MSFT_xSQLServerDatabaseRecoveryModel/MSFT_xSQLServerDatabaseRecoveryModel.psm1 b/DSCResources/MSFT_SqlDatabaseRecoveryModel/MSFT_SqlDatabaseRecoveryModel.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerDatabaseRecoveryModel/MSFT_xSQLServerDatabaseRecoveryModel.psm1 rename to DSCResources/MSFT_SqlDatabaseRecoveryModel/MSFT_SqlDatabaseRecoveryModel.psm1 index 74f084cef..2f91d1a7e 100644 --- a/DSCResources/MSFT_xSQLServerDatabaseRecoveryModel/MSFT_xSQLServerDatabaseRecoveryModel.psm1 +++ b/DSCResources/MSFT_SqlDatabaseRecoveryModel/MSFT_SqlDatabaseRecoveryModel.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerDatabaseRecoveryModel/MSFT_xSQLServerDatabaseRecoveryModel.schema.mof b/DSCResources/MSFT_SqlDatabaseRecoveryModel/MSFT_SqlDatabaseRecoveryModel.schema.mof similarity index 76% rename from DSCResources/MSFT_xSQLServerDatabaseRecoveryModel/MSFT_xSQLServerDatabaseRecoveryModel.schema.mof rename to DSCResources/MSFT_SqlDatabaseRecoveryModel/MSFT_SqlDatabaseRecoveryModel.schema.mof index 0ffb09a92..51614519b 100644 --- a/DSCResources/MSFT_xSQLServerDatabaseRecoveryModel/MSFT_xSQLServerDatabaseRecoveryModel.schema.mof +++ b/DSCResources/MSFT_SqlDatabaseRecoveryModel/MSFT_SqlDatabaseRecoveryModel.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0"), FriendlyName("xSQLServerDatabaseRecoveryModel")] -class MSFT_xSQLServerDatabaseRecoveryModel : OMI_BaseResource +[ClassVersion("1.0"), FriendlyName("SqlDatabaseRecoveryModel")] +class MSFT_SqlDatabaseRecoveryModel : OMI_BaseResource { [Key, Description("The SQL database name")] String Name; [Required, Description("The recovery model to use for the database."), ValueMap{"Full","Simple","BulkLogged"}, Values{"Full","Simple","BulkLogged"}] String RecoveryModel; diff --git a/DSCResources/MSFT_xSQLServerDatabaseRole/MSFT_xSQLServerDatabaseRole.psm1 b/DSCResources/MSFT_SqlDatabaseRole/MSFT_SqlDatabaseRole.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerDatabaseRole/MSFT_xSQLServerDatabaseRole.psm1 rename to DSCResources/MSFT_SqlDatabaseRole/MSFT_SqlDatabaseRole.psm1 index 61f7f3f6b..0eb032815 100644 --- a/DSCResources/MSFT_xSQLServerDatabaseRole/MSFT_xSQLServerDatabaseRole.psm1 +++ b/DSCResources/MSFT_SqlDatabaseRole/MSFT_SqlDatabaseRole.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# diff --git a/DSCResources/MSFT_xSQLServerDatabaseRole/MSFT_xSQLServerDatabaseRole.schema.mof b/DSCResources/MSFT_SqlDatabaseRole/MSFT_SqlDatabaseRole.schema.mof similarity index 86% rename from DSCResources/MSFT_xSQLServerDatabaseRole/MSFT_xSQLServerDatabaseRole.schema.mof rename to DSCResources/MSFT_SqlDatabaseRole/MSFT_SqlDatabaseRole.schema.mof index ef07952f9..2baf77dfc 100644 --- a/DSCResources/MSFT_xSQLServerDatabaseRole/MSFT_xSQLServerDatabaseRole.schema.mof +++ b/DSCResources/MSFT_SqlDatabaseRole/MSFT_SqlDatabaseRole.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerDatabaseRole")] -class MSFT_xSQLServerDatabaseRole : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlDatabaseRole")] +class MSFT_SqlDatabaseRole : OMI_BaseResource { [Write, Description("If 'Present' (the default value) then the login (user) will be added to the role(s). If 'Absent' then the login (user) will be removed from the role(s)."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; [Key, Description("The name of the login that will become a member, or removed as a member, of the role(s).")] String Name; diff --git a/DSCResources/MSFT_xSQLServerRSConfig/MSFT_xSQLServerRSConfig.psm1 b/DSCResources/MSFT_SqlRS/MSFT_SqlRS.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerRSConfig/MSFT_xSQLServerRSConfig.psm1 rename to DSCResources/MSFT_SqlRS/MSFT_SqlRS.psm1 index 10e37433e..bf4e62655 100644 --- a/DSCResources/MSFT_xSQLServerRSConfig/MSFT_xSQLServerRSConfig.psm1 +++ b/DSCResources/MSFT_SqlRS/MSFT_SqlRS.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# diff --git a/DSCResources/MSFT_xSQLServerRSConfig/MSFT_xSQLServerRSConfig.schema.mof b/DSCResources/MSFT_SqlRS/MSFT_SqlRS.schema.mof similarity index 90% rename from DSCResources/MSFT_xSQLServerRSConfig/MSFT_xSQLServerRSConfig.schema.mof rename to DSCResources/MSFT_SqlRS/MSFT_SqlRS.schema.mof index ff03fb317..4f4ae8b99 100644 --- a/DSCResources/MSFT_xSQLServerRSConfig/MSFT_xSQLServerRSConfig.schema.mof +++ b/DSCResources/MSFT_SqlRS/MSFT_SqlRS.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerRSConfig")] -class MSFT_xSQLServerRSConfig : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlRS")] +class MSFT_SqlRS : OMI_BaseResource { [Key, Description("Name of the SQL Server Reporting Services instance to be configured.")] String InstanceName; [Required, Description("Name of the SQL Server to host the Reporting Service database.")] String RSSQLServer; diff --git a/DSCResources/MSFT_xSQLServerRSSecureConnectionLevel/MSFT_xSQLServerRSSecureConnectionLevel.psm1 b/DSCResources/MSFT_SqlRSSecureConnectionLevel/MSFT_SqlRSSecureConnectionLevel.psm1 similarity index 97% rename from DSCResources/MSFT_xSQLServerRSSecureConnectionLevel/MSFT_xSQLServerRSSecureConnectionLevel.psm1 rename to DSCResources/MSFT_SqlRSSecureConnectionLevel/MSFT_SqlRSSecureConnectionLevel.psm1 index e6319223c..ad84790e3 100644 --- a/DSCResources/MSFT_xSQLServerRSSecureConnectionLevel/MSFT_xSQLServerRSSecureConnectionLevel.psm1 +++ b/DSCResources/MSFT_SqlRSSecureConnectionLevel/MSFT_SqlRSSecureConnectionLevel.psm1 @@ -2,7 +2,7 @@ $currentPath = Split-Path -Parent $MyInvocation.MyCommand.Path Write-Debug -Message "CurrentPath: $currentPath" # Load Common Code -Import-Module $currentPath\..\..\xSQLServerHelper.psm1 -Verbose:$false -ErrorAction Stop +Import-Module $currentPath\..\..\SqlServerDSCHelper.psm1 -Verbose:$false -ErrorAction Stop function Get-TargetResource { diff --git a/DSCResources/MSFT_xSQLServerRSSecureConnectionLevel/MSFT_xSQLServerRSSecureConnectionLevel.schema.mof b/DSCResources/MSFT_SqlRSSecureConnectionLevel/MSFT_SqlRSSecureConnectionLevel.schema.mof similarity index 72% rename from DSCResources/MSFT_xSQLServerRSSecureConnectionLevel/MSFT_xSQLServerRSSecureConnectionLevel.schema.mof rename to DSCResources/MSFT_SqlRSSecureConnectionLevel/MSFT_SqlRSSecureConnectionLevel.schema.mof index 9539097ed..370766edf 100644 --- a/DSCResources/MSFT_xSQLServerRSSecureConnectionLevel/MSFT_xSQLServerRSSecureConnectionLevel.schema.mof +++ b/DSCResources/MSFT_SqlRSSecureConnectionLevel/MSFT_SqlRSSecureConnectionLevel.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerRSSecureConnectionLevel")] -class MSFT_xSQLServerRSSecureConnectionLevel : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlRSSecureConnectionLevel")] +class MSFT_SqlRSSecureConnectionLevel : OMI_BaseResource { [Key, Description("SQL instance to set secure connection level for.")] String InstanceName; [Key, Description("SQL Server Reporting Service secure connection level.")] Uint16 SecureConnectionLevel; diff --git a/DSCResources/MSFT_xSQLServerScript/MSFT_xSQLServerScript.psm1 b/DSCResources/MSFT_SqlScript/MSFT_SqlScript.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerScript/MSFT_xSQLServerScript.psm1 rename to DSCResources/MSFT_SqlScript/MSFT_SqlScript.psm1 index bb31a336d..d7e02b503 100644 --- a/DSCResources/MSFT_xSQLServerScript/MSFT_xSQLServerScript.psm1 +++ b/DSCResources/MSFT_SqlScript/MSFT_SqlScript.psm1 @@ -1,5 +1,5 @@ $script:currentPath = Split-Path -Path $MyInvocation.MyCommand.Path -Parent -Import-Module -Name (Join-Path -Path (Split-Path -Path (Split-Path -Path $script:currentPath -Parent) -Parent) -ChildPath 'xSQLServerHelper.psm1') +Import-Module -Name (Join-Path -Path (Split-Path -Path (Split-Path -Path $script:currentPath -Parent) -Parent) -ChildPath 'SqlServerDSCHelper.psm1') <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerScript/MSFT_xSQLServerScript.schema.mof b/DSCResources/MSFT_SqlScript/MSFT_SqlScript.schema.mof similarity index 95% rename from DSCResources/MSFT_xSQLServerScript/MSFT_xSQLServerScript.schema.mof rename to DSCResources/MSFT_SqlScript/MSFT_SqlScript.schema.mof index e827564e6..3627db5b2 100644 --- a/DSCResources/MSFT_xSQLServerScript/MSFT_xSQLServerScript.schema.mof +++ b/DSCResources/MSFT_SqlScript/MSFT_SqlScript.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerScript")] -class MSFT_xSQLServerScript : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlScript")] +class MSFT_SqlScript : OMI_BaseResource { [Key, Description("The name of an instance of the Database Engine. For a default instance, only specify the computer name. For a named instance, use the format ComputerName\\InstanceName")] String ServerInstance; [Key, Description("Path to the T-SQL file that will perform Set action.")] String SetFilePath; diff --git a/DSCResources/MSFT_xSQLServerConfiguration/MSFT_xSQLServerConfiguration.psm1 b/DSCResources/MSFT_SqlServerConfiguration/MSFT_SqlServerConfiguration.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerConfiguration/MSFT_xSQLServerConfiguration.psm1 rename to DSCResources/MSFT_SqlServerConfiguration/MSFT_SqlServerConfiguration.psm1 index 1cb38ac73..34ac3752c 100644 --- a/DSCResources/MSFT_xSQLServerConfiguration/MSFT_xSQLServerConfiguration.psm1 +++ b/DSCResources/MSFT_SqlServerConfiguration/MSFT_SqlServerConfiguration.psm1 @@ -1,6 +1,6 @@ # Load Common Code Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerConfiguration/MSFT_xSQLServerConfiguration.schema.mof b/DSCResources/MSFT_SqlServerConfiguration/MSFT_SqlServerConfiguration.schema.mof similarity index 84% rename from DSCResources/MSFT_xSQLServerConfiguration/MSFT_xSQLServerConfiguration.schema.mof rename to DSCResources/MSFT_SqlServerConfiguration/MSFT_SqlServerConfiguration.schema.mof index e90976a76..f7af2c7b4 100644 --- a/DSCResources/MSFT_xSQLServerConfiguration/MSFT_xSQLServerConfiguration.schema.mof +++ b/DSCResources/MSFT_SqlServerConfiguration/MSFT_SqlServerConfiguration.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerConfiguration")] -class MSFT_xSQLServerConfiguration : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlServerConfiguration")] +class MSFT_SqlServerConfiguration : OMI_BaseResource { [Key, Description("The hostname of the SQL Server to be configured.")] String SQLServer; [Key, Description("Name of the SQL instance to be configured.")] String SQLInstanceName; diff --git a/DSCResources/MSFT_xSQLServerEndpoint/MSFT_xSQLServerEndpoint.psm1 b/DSCResources/MSFT_SqlServerEndpoint/MSFT_SqlServerEndpoint.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerEndpoint/MSFT_xSQLServerEndpoint.psm1 rename to DSCResources/MSFT_SqlServerEndpoint/MSFT_SqlServerEndpoint.psm1 index 0e33fc9f5..ff61a36d5 100644 --- a/DSCResources/MSFT_xSQLServerEndpoint/MSFT_xSQLServerEndpoint.psm1 +++ b/DSCResources/MSFT_SqlServerEndpoint/MSFT_SqlServerEndpoint.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerEndpoint/MSFT_xSQLServerEndpoint.schema.mof b/DSCResources/MSFT_SqlServerEndpoint/MSFT_SqlServerEndpoint.schema.mof similarity index 87% rename from DSCResources/MSFT_xSQLServerEndpoint/MSFT_xSQLServerEndpoint.schema.mof rename to DSCResources/MSFT_SqlServerEndpoint/MSFT_SqlServerEndpoint.schema.mof index 737bb8dbf..c0a894107 100644 --- a/DSCResources/MSFT_xSQLServerEndpoint/MSFT_xSQLServerEndpoint.schema.mof +++ b/DSCResources/MSFT_SqlServerEndpoint/MSFT_SqlServerEndpoint.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerEndpoint")] -class MSFT_xSQLServerEndpoint : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlServerEndpoint")] +class MSFT_SqlServerEndpoint : OMI_BaseResource { [Key, Description("The name of the endpoint.")] String EndpointName; [Write, Description("If the endpoint should be present or absent. Default values is 'Present'."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; diff --git a/DSCResources/MSFT_xSQLServerEndpointPermission/MSFT_xSQLServerEndpointPermission.psm1 b/DSCResources/MSFT_SqlServerEndpointPermission/MSFT_SqlServerEndpointPermission.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerEndpointPermission/MSFT_xSQLServerEndpointPermission.psm1 rename to DSCResources/MSFT_SqlServerEndpointPermission/MSFT_SqlServerEndpointPermission.psm1 index 94c538a5f..dd0bb9a37 100644 --- a/DSCResources/MSFT_xSQLServerEndpointPermission/MSFT_xSQLServerEndpointPermission.psm1 +++ b/DSCResources/MSFT_SqlServerEndpointPermission/MSFT_SqlServerEndpointPermission.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerEndpointPermission/MSFT_xSQLServerEndpointPermission.schema.mof b/DSCResources/MSFT_SqlServerEndpointPermission/MSFT_SqlServerEndpointPermission.schema.mof similarity index 84% rename from DSCResources/MSFT_xSQLServerEndpointPermission/MSFT_xSQLServerEndpointPermission.schema.mof rename to DSCResources/MSFT_SqlServerEndpointPermission/MSFT_SqlServerEndpointPermission.schema.mof index d50707093..24accc596 100644 --- a/DSCResources/MSFT_xSQLServerEndpointPermission/MSFT_xSQLServerEndpointPermission.schema.mof +++ b/DSCResources/MSFT_SqlServerEndpointPermission/MSFT_SqlServerEndpointPermission.schema.mof @@ -1,6 +1,6 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerEndpointPermission")] -class MSFT_xSQLServerEndpointPermission : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlServerEndpointPermission")] +class MSFT_SqlServerEndpointPermission : OMI_BaseResource { [Key, Description("The name of the SQL instance to be configured.")] String InstanceName; [Required, Description("The host name of the SQL Server to be configured.")] String NodeName; diff --git a/DSCResources/MSFT_xSQLServerEndpointState/MSFT_xSQLServerEndpointState.psm1 b/DSCResources/MSFT_SqlServerEndpointState/MSFT_SqlServerEndpointState.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerEndpointState/MSFT_xSQLServerEndpointState.psm1 rename to DSCResources/MSFT_SqlServerEndpointState/MSFT_SqlServerEndpointState.psm1 index 1ba8d3232..ea2753091 100644 --- a/DSCResources/MSFT_xSQLServerEndpointState/MSFT_xSQLServerEndpointState.psm1 +++ b/DSCResources/MSFT_SqlServerEndpointState/MSFT_SqlServerEndpointState.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerEndpointState/MSFT_xSQLServerEndpointState.schema.mof b/DSCResources/MSFT_SqlServerEndpointState/MSFT_SqlServerEndpointState.schema.mof similarity index 81% rename from DSCResources/MSFT_xSQLServerEndpointState/MSFT_xSQLServerEndpointState.schema.mof rename to DSCResources/MSFT_SqlServerEndpointState/MSFT_SqlServerEndpointState.schema.mof index 14edfab02..5e4bd5fc5 100644 --- a/DSCResources/MSFT_xSQLServerEndpointState/MSFT_xSQLServerEndpointState.schema.mof +++ b/DSCResources/MSFT_SqlServerEndpointState/MSFT_SqlServerEndpointState.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerEndpointState")] -class MSFT_xSQLServerEndpointState : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlServerEndpointState")] +class MSFT_SqlServerEndpointState : OMI_BaseResource { [Key, Description("The name of the SQL instance to be configured.")] String InstanceName; [Write, Description("The host name of the SQL Server to be configured. Default value is $env:COMPUTERNAME.")] String NodeName; diff --git a/DSCResources/MSFT_xSQLServerLogin/MSFT_xSQLServerLogin.psm1 b/DSCResources/MSFT_SqlServerLogin/MSFT_SqlServerLogin.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerLogin/MSFT_xSQLServerLogin.psm1 rename to DSCResources/MSFT_SqlServerLogin/MSFT_SqlServerLogin.psm1 index c968c945b..14d7f15ea 100644 --- a/DSCResources/MSFT_xSQLServerLogin/MSFT_xSQLServerLogin.psm1 +++ b/DSCResources/MSFT_SqlServerLogin/MSFT_SqlServerLogin.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# diff --git a/DSCResources/MSFT_xSQLServerLogin/MSFT_xSQLServerLogin.schema.mof b/DSCResources/MSFT_SqlServerLogin/MSFT_SqlServerLogin.schema.mof similarity index 94% rename from DSCResources/MSFT_xSQLServerLogin/MSFT_xSQLServerLogin.schema.mof rename to DSCResources/MSFT_SqlServerLogin/MSFT_SqlServerLogin.schema.mof index 51f15fc66..63b88af46 100644 --- a/DSCResources/MSFT_xSQLServerLogin/MSFT_xSQLServerLogin.schema.mof +++ b/DSCResources/MSFT_SqlServerLogin/MSFT_SqlServerLogin.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerLogin")] -class MSFT_xSQLServerLogin : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlServerLogin")] +class MSFT_SqlServerLogin : OMI_BaseResource { [Write, Description("The specified login is Present or Absent. Default is Present."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; [Key, Description("The name of the login.")] String Name; diff --git a/DSCResources/MSFT_xSQLServerMaxDop/MSFT_xSQLServerMaxDop.psm1 b/DSCResources/MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.psm1 similarity index 96% rename from DSCResources/MSFT_xSQLServerMaxDop/MSFT_xSQLServerMaxDop.psm1 rename to DSCResources/MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.psm1 index 1eb7d49f7..1bd3c5ee9 100644 --- a/DSCResources/MSFT_xSQLServerMaxDop/MSFT_xSQLServerMaxDop.psm1 +++ b/DSCResources/MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerMaxDop/MSFT_xSQLServerMaxDop.schema.mof b/DSCResources/MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.schema.mof similarity index 92% rename from DSCResources/MSFT_xSQLServerMaxDop/MSFT_xSQLServerMaxDop.schema.mof rename to DSCResources/MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.schema.mof index 91efe692c..c7730aa1e 100644 --- a/DSCResources/MSFT_xSQLServerMaxDop/MSFT_xSQLServerMaxDop.schema.mof +++ b/DSCResources/MSFT_SqlServerMaxDop/MSFT_SqlServerMaxDop.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerMaxDop")] -class MSFT_xSQLServerMaxDop : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlServerMaxDop")] +class MSFT_SqlServerMaxDop : OMI_BaseResource { [Write, Description("When set to 'Present' then max degree of parallelism will be set to either the value in parameter MaxDop or dynamically configured when parameter DynamicAlloc is set to $true. When set to 'Absent' max degree of parallelism will be set to 0 which means no limit in number of processors used in parallel plan execution."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; [Write, Description("If set to $true then max degree of parallelism will be dynamically configured. When this is set parameter is set to $true, the parameter MaxDop must be set to $null or not be configured.")] Boolean DynamicAlloc; diff --git a/DSCResources/MSFT_xSQLServerMemory/MSFT_xSQLServerMemory.psm1 b/DSCResources/MSFT_SqlServerMemory/MSFT_SqlServerMemory.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerMemory/MSFT_xSQLServerMemory.psm1 rename to DSCResources/MSFT_SqlServerMemory/MSFT_SqlServerMemory.psm1 index db6ac74b7..9b53b3400 100644 --- a/DSCResources/MSFT_xSQLServerMemory/MSFT_xSQLServerMemory.psm1 +++ b/DSCResources/MSFT_SqlServerMemory/MSFT_SqlServerMemory.psm1 @@ -1,4 +1,4 @@ -Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) -ChildPath 'xSQLServerHelper.psm1') -Force +Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) -ChildPath 'SqlServerDSCHelper.psm1') -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerMemory/MSFT_xSQLServerMemory.schema.mof b/DSCResources/MSFT_SqlServerMemory/MSFT_SqlServerMemory.schema.mof similarity index 93% rename from DSCResources/MSFT_xSQLServerMemory/MSFT_xSQLServerMemory.schema.mof rename to DSCResources/MSFT_SqlServerMemory/MSFT_SqlServerMemory.schema.mof index 4f6bbb202..9ee925d2f 100644 --- a/DSCResources/MSFT_xSQLServerMemory/MSFT_xSQLServerMemory.schema.mof +++ b/DSCResources/MSFT_SqlServerMemory/MSFT_SqlServerMemory.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerMemory")] -class MSFT_xSQLServerMemory : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlServerMemory")] +class MSFT_SqlServerMemory : OMI_BaseResource { [Key, Description("The name of the SQL instance to be configured.")] String SQLInstanceName; [Write, Description("The host name of the SQL Server to be configured. Default value is $env:COMPUTERNAME.")] String SQLServer; diff --git a/DSCResources/MSFT_xSQLServerNetwork/MSFT_xSQLServerNetwork.psm1 b/DSCResources/MSFT_SqlServerNetwork/MSFT_SqlServerNetwork.psm1 similarity index 98% rename from DSCResources/MSFT_xSQLServerNetwork/MSFT_xSQLServerNetwork.psm1 rename to DSCResources/MSFT_SqlServerNetwork/MSFT_SqlServerNetwork.psm1 index 23309fd95..f20b9477e 100644 --- a/DSCResources/MSFT_xSQLServerNetwork/MSFT_xSQLServerNetwork.psm1 +++ b/DSCResources/MSFT_SqlServerNetwork/MSFT_SqlServerNetwork.psm1 @@ -1,10 +1,10 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') -Force + -ChildPath 'SqlServerDSCHelper.psm1') -Force Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` -ChildPath 'CommonResourceHelper.psm1') # Load localized string data -$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_xSQLServerNetwork' +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlServerNetwork' <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerNetwork/MSFT_xSQLServerNetwork.schema.mof b/DSCResources/MSFT_SqlServerNetwork/MSFT_SqlServerNetwork.schema.mof similarity index 92% rename from DSCResources/MSFT_xSQLServerNetwork/MSFT_xSQLServerNetwork.schema.mof rename to DSCResources/MSFT_SqlServerNetwork/MSFT_SqlServerNetwork.schema.mof index 7f21b4f58..58624e795 100644 --- a/DSCResources/MSFT_xSQLServerNetwork/MSFT_xSQLServerNetwork.schema.mof +++ b/DSCResources/MSFT_SqlServerNetwork/MSFT_SqlServerNetwork.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerNetwork")] -class MSFT_xSQLServerNetwork : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlServerNetwork")] +class MSFT_SqlServerNetwork : OMI_BaseResource { [Key, Description("The name of the SQL instance to be configured.")] String InstanceName; [Required, Description("The name of network protocol to be configured. Only tcp is currently supported."), ValueMap{"Tcp"}, Values{"Tcp"}] String ProtocolName; diff --git a/DSCResources/MSFT_xSQLServerNetwork/en-US/MSFT_xSQLServerNetwork.strings.psd1 b/DSCResources/MSFT_SqlServerNetwork/en-US/MSFT_SqlServerNetwork.strings.psd1 similarity index 93% rename from DSCResources/MSFT_xSQLServerNetwork/en-US/MSFT_xSQLServerNetwork.strings.psd1 rename to DSCResources/MSFT_SqlServerNetwork/en-US/MSFT_SqlServerNetwork.strings.psd1 index d19f1e234..2454c12de 100644 --- a/DSCResources/MSFT_xSQLServerNetwork/en-US/MSFT_xSQLServerNetwork.strings.psd1 +++ b/DSCResources/MSFT_SqlServerNetwork/en-US/MSFT_SqlServerNetwork.strings.psd1 @@ -1,4 +1,4 @@ -# Localized resources for xSQLServerNetwork +# Localized resources for SqlServerNetwork ConvertFrom-StringData @' GetNetworkProtocol = Getting network protocol [{0}] for SQL instance [{1}]. diff --git a/DSCResources/MSFT_xSQLServerPermission/MSFT_xSQLServerPermission.psm1 b/DSCResources/MSFT_SqlServerPermission/MSFT_SqlServerPermission.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerPermission/MSFT_xSQLServerPermission.psm1 rename to DSCResources/MSFT_SqlServerPermission/MSFT_SqlServerPermission.psm1 index c0c0f1e62..c24dd413f 100644 --- a/DSCResources/MSFT_xSQLServerPermission/MSFT_xSQLServerPermission.psm1 +++ b/DSCResources/MSFT_SqlServerPermission/MSFT_SqlServerPermission.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerPermission/MSFT_xSQLServerPermission.schema.mof b/DSCResources/MSFT_SqlServerPermission/MSFT_SqlServerPermission.schema.mof similarity index 88% rename from DSCResources/MSFT_xSQLServerPermission/MSFT_xSQLServerPermission.schema.mof rename to DSCResources/MSFT_SqlServerPermission/MSFT_SqlServerPermission.schema.mof index d67969841..b1e1bb639 100644 --- a/DSCResources/MSFT_xSQLServerPermission/MSFT_xSQLServerPermission.schema.mof +++ b/DSCResources/MSFT_SqlServerPermission/MSFT_SqlServerPermission.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerPermission")] -class MSFT_xSQLServerPermission : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlServerPermission")] +class MSFT_SqlServerPermission : OMI_BaseResource { [Key, Description("The name of the SQL instance to be configured.")] String InstanceName; [Write, Description("The host name of the SQL Server to be configured. Default value is $env:COMPUTERNAME.")] String NodeName; diff --git a/DSCResources/MSFT_xSQLServerReplication/MSFT_xSQLServerReplication.psm1 b/DSCResources/MSFT_SqlServerReplication/MSFT_SqlServerReplication.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerReplication/MSFT_xSQLServerReplication.psm1 rename to DSCResources/MSFT_SqlServerReplication/MSFT_SqlServerReplication.psm1 index 482653263..a7f09403c 100644 --- a/DSCResources/MSFT_xSQLServerReplication/MSFT_xSQLServerReplication.psm1 +++ b/DSCResources/MSFT_SqlServerReplication/MSFT_SqlServerReplication.psm1 @@ -1,4 +1,4 @@ -$dom = [AppDomain]::CreateDomain('xSQLServerReplication') +$dom = [AppDomain]::CreateDomain('SqlServerReplication') function Get-TargetResource { diff --git a/DSCResources/MSFT_xSQLServerReplication/MSFT_xSQLServerReplication.schema.mof b/DSCResources/MSFT_SqlServerReplication/MSFT_SqlServerReplication.schema.mof similarity index 88% rename from DSCResources/MSFT_xSQLServerReplication/MSFT_xSQLServerReplication.schema.mof rename to DSCResources/MSFT_SqlServerReplication/MSFT_SqlServerReplication.schema.mof index 609bc1aaf..1e4332e8d 100644 --- a/DSCResources/MSFT_xSQLServerReplication/MSFT_xSQLServerReplication.schema.mof +++ b/DSCResources/MSFT_SqlServerReplication/MSFT_SqlServerReplication.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerReplication")] -class MSFT_xSQLServerReplication : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlServerReplication")] +class MSFT_SqlServerReplication : OMI_BaseResource { [Key, Description("SQL Server instance name where replication distribution will be configured")] String InstanceName; [Write, ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}] String Ensure; diff --git a/DSCResources/MSFT_xSQLServerRole/MSFT_xSQLServerRole.psm1 b/DSCResources/MSFT_SqlServerRole/MSFT_SqlServerRole.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerRole/MSFT_xSQLServerRole.psm1 rename to DSCResources/MSFT_SqlServerRole/MSFT_SqlServerRole.psm1 index 8c01065db..4df469fab 100644 --- a/DSCResources/MSFT_xSQLServerRole/MSFT_xSQLServerRole.psm1 +++ b/DSCResources/MSFT_SqlServerRole/MSFT_SqlServerRole.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerRole/MSFT_xSQLServerRole.schema.mof b/DSCResources/MSFT_SqlServerRole/MSFT_SqlServerRole.schema.mof similarity index 91% rename from DSCResources/MSFT_xSQLServerRole/MSFT_xSQLServerRole.schema.mof rename to DSCResources/MSFT_SqlServerRole/MSFT_SqlServerRole.schema.mof index d7c1a397b..3cd0100e3 100644 --- a/DSCResources/MSFT_xSQLServerRole/MSFT_xSQLServerRole.schema.mof +++ b/DSCResources/MSFT_SqlServerRole/MSFT_SqlServerRole.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerRole")] -class MSFT_xSQLServerRole : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlServerRole")] +class MSFT_SqlServerRole : OMI_BaseResource { [Key, Description("The name of of SQL role to add or remove.")] String ServerRoleName; [Key, Description("The host name of the SQL Server to be configured.")] String SQLServer; diff --git a/DSCResources/MSFT_xSQLServerServiceAccount/MSFT_xSQLServerServiceAccount.psm1 b/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.psm1 similarity index 98% rename from DSCResources/MSFT_xSQLServerServiceAccount/MSFT_xSQLServerServiceAccount.psm1 rename to DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.psm1 index db2f4b304..76b247cc3 100644 --- a/DSCResources/MSFT_xSQLServerServiceAccount/MSFT_xSQLServerServiceAccount.psm1 +++ b/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.psm1 @@ -1,10 +1,10 @@ Import-Module -Name (Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') + -ChildPath 'SqlServerDSCHelper.psm1') Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` -ChildPath 'CommonResourceHelper.psm1') -$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_xSQLServerServiceAccount' +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlServerServiceAccount' <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerServiceAccount/MSFT_xSQLServerServiceAccount.schema.mof b/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.schema.mof similarity index 88% rename from DSCResources/MSFT_xSQLServerServiceAccount/MSFT_xSQLServerServiceAccount.schema.mof rename to DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.schema.mof index feb42c03f..5b96929c8 100644 --- a/DSCResources/MSFT_xSQLServerServiceAccount/MSFT_xSQLServerServiceAccount.schema.mof +++ b/DSCResources/MSFT_SqlServerServiceAccount/MSFT_SqlServerServiceAccount.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerServiceAccount")] -class MSFT_xSQLServerServiceAccount : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlServerServiceAccount")] +class MSFT_SqlServerServiceAccount : OMI_BaseResource { [Key, Description("Hostname of the SQL Server.")] String SQLServer; [Key, Description("Name of the SQL instance.")] String SQLInstanceName; diff --git a/DSCResources/MSFT_xSQLServerServiceAccount/en-US/MSFT_xSQLServerServiceAccount.strings.psd1 b/DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_xSQLServerServiceAccount.strings.psd1 similarity index 92% rename from DSCResources/MSFT_xSQLServerServiceAccount/en-US/MSFT_xSQLServerServiceAccount.strings.psd1 rename to DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_xSQLServerServiceAccount.strings.psd1 index c18e0b70e..e0b1330df 100644 --- a/DSCResources/MSFT_xSQLServerServiceAccount/en-US/MSFT_xSQLServerServiceAccount.strings.psd1 +++ b/DSCResources/MSFT_SqlServerServiceAccount/en-US/MSFT_xSQLServerServiceAccount.strings.psd1 @@ -1,4 +1,4 @@ -# Localized resources for xSQLServerServiceAccount +# Localized resources for SqlServerServiceAccount ConvertFrom-StringData @' ForceServiceAccountUpdate = Force specified, skipping tests. With this configuration, Test-TargetResource will always return 'False'. diff --git a/DSCResources/MSFT_xSQLServerSetup/MSFT_xSQLServerSetup.psm1 b/DSCResources/MSFT_SqlSetup/MSFT_SqlSetup.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerSetup/MSFT_xSQLServerSetup.psm1 rename to DSCResources/MSFT_SqlSetup/MSFT_SqlSetup.psm1 index 7f9cbbf2b..8cc9c1260 100644 --- a/DSCResources/MSFT_xSQLServerSetup/MSFT_xSQLServerSetup.psm1 +++ b/DSCResources/MSFT_SqlSetup/MSFT_SqlSetup.psm1 @@ -1,10 +1,10 @@ Import-Module -Name (Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') + -ChildPath 'SqlServerDSCHelper.psm1') Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` -ChildPath 'CommonResourceHelper.psm1') -$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_xSQLServerSetup' +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_SqlSetup' <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerSetup/MSFT_xSQLServerSetup.schema.mof b/DSCResources/MSFT_SqlSetup/MSFT_SqlSetup.schema.mof similarity index 98% rename from DSCResources/MSFT_xSQLServerSetup/MSFT_xSQLServerSetup.schema.mof rename to DSCResources/MSFT_SqlSetup/MSFT_SqlSetup.schema.mof index 18ae419a0..b937d47af 100644 --- a/DSCResources/MSFT_xSQLServerSetup/MSFT_xSQLServerSetup.schema.mof +++ b/DSCResources/MSFT_SqlSetup/MSFT_SqlSetup.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerSetup")] -class MSFT_xSQLServerSetup : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlSetup")] +class MSFT_SqlSetup : OMI_BaseResource { [Write, Description("The action to be performed. Default value is 'Install'."), ValueMap{"Install","InstallFailoverCluster","AddNode","PrepareFailoverCluster","CompleteFailoverCluster"}, Values{"Install","InstallFailoverCluster","AddNode","PrepareFailoverCluster","CompleteFailoverCluster"}] String Action; [Write, Description("The path to the root of the source files for installation. I.e and UNC path to a shared resource. Environment variables can be used in the path.")] String SourcePath; diff --git a/DSCResources/MSFT_xSQLServerSetup/en-US/MSFT_xSQLServerSetup.strings.psd1 b/DSCResources/MSFT_SqlSetup/en-US/MSFT_SqlSetup.strings.psd1 similarity index 99% rename from DSCResources/MSFT_xSQLServerSetup/en-US/MSFT_xSQLServerSetup.strings.psd1 rename to DSCResources/MSFT_SqlSetup/en-US/MSFT_SqlSetup.strings.psd1 index 98a2174af..9530fcfbf 100644 --- a/DSCResources/MSFT_xSQLServerSetup/en-US/MSFT_xSQLServerSetup.strings.psd1 +++ b/DSCResources/MSFT_SqlSetup/en-US/MSFT_SqlSetup.strings.psd1 @@ -1,4 +1,4 @@ -# Localized resources for xSQLServerSetup +# Localized resources for SqlSetup ConvertFrom-StringData @' UsingPath = Using path '{0}'. diff --git a/DSCResources/MSFT_xSQLServerSetup/sv-SE/MSFT_xSQLServerSetup.strings.psd1 b/DSCResources/MSFT_SqlSetup/sv-SE/MSFT_SqlSetup.strings.psd1 similarity index 99% rename from DSCResources/MSFT_xSQLServerSetup/sv-SE/MSFT_xSQLServerSetup.strings.psd1 rename to DSCResources/MSFT_SqlSetup/sv-SE/MSFT_SqlSetup.strings.psd1 index 2011dec31..ed61272c7 100644 --- a/DSCResources/MSFT_xSQLServerSetup/sv-SE/MSFT_xSQLServerSetup.strings.psd1 +++ b/DSCResources/MSFT_SqlSetup/sv-SE/MSFT_SqlSetup.strings.psd1 @@ -1,4 +1,4 @@ -# Swedish localized resources for xSQLServerSetup +# Swedish localized resources for SqlSetup ConvertFrom-StringData @' UsingPath = Använder sökväg '{0}'. diff --git a/DSCResources/MSFT_xWaitForAvailabilityGroup/MSFT_xWaitForAvailabilityGroup.psm1 b/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.psm1 similarity index 99% rename from DSCResources/MSFT_xWaitForAvailabilityGroup/MSFT_xWaitForAvailabilityGroup.psm1 rename to DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.psm1 index e69cd82b6..c369d1aa1 100644 --- a/DSCResources/MSFT_xWaitForAvailabilityGroup/MSFT_xWaitForAvailabilityGroup.psm1 +++ b/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.psm1 @@ -1,5 +1,5 @@ Import-Module -Name (Join-Path -Path (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent) ` - -ChildPath 'xSQLServerHelper.psm1') ` + -ChildPath 'SqlServerDSCHelper.psm1') ` -Force <# diff --git a/DSCResources/MSFT_xWaitForAvailabilityGroup/MSFT_xWaitForAvailabilityGroup.schema.mof b/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.schema.mof similarity index 84% rename from DSCResources/MSFT_xWaitForAvailabilityGroup/MSFT_xWaitForAvailabilityGroup.schema.mof rename to DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.schema.mof index 1562c36ef..a848cabba 100644 --- a/DSCResources/MSFT_xWaitForAvailabilityGroup/MSFT_xWaitForAvailabilityGroup.schema.mof +++ b/DSCResources/MSFT_SqlWaitForAvailabilityGroup/MSFT_SqlWaitForAvailabilityGroup.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xWaitForAvailabilityGroup")] -class MSFT_xWaitForAvailabilityGroup : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlWaitForAvailabilityGroup")] +class MSFT_SqlWaitForAvailabilityGroup : OMI_BaseResource { [Key, Description("Name of the cluster role/group to look for (normally the same as the Availability Group name).")] String Name; [Write, Description("The interval, in seconds, to check for the presence of the cluster role/group. Default value is 20 seconds. When the cluster role/group has been found the resource will wait for this amount of time once more before returning.")] Uint64 RetryIntervalSec; diff --git a/DSCResources/MSFT_xSQLServerFirewall/MSFT_xSQLServerFirewall.psm1 b/DSCResources/MSFT_SqlWindowsFirewall/MSFT_SqlWindowsFirewall.psm1 similarity index 99% rename from DSCResources/MSFT_xSQLServerFirewall/MSFT_xSQLServerFirewall.psm1 rename to DSCResources/MSFT_SqlWindowsFirewall/MSFT_SqlWindowsFirewall.psm1 index 4f47d5100..61e804d05 100644 --- a/DSCResources/MSFT_xSQLServerFirewall/MSFT_xSQLServerFirewall.psm1 +++ b/DSCResources/MSFT_SqlWindowsFirewall/MSFT_SqlWindowsFirewall.psm1 @@ -1,5 +1,5 @@ $script:currentPath = Split-Path -Path $MyInvocation.MyCommand.Path -Parent -Import-Module -Name (Join-Path -Path (Split-Path -Path (Split-Path -Path $script:currentPath -Parent) -Parent) -ChildPath 'xSQLServerHelper.psm1') +Import-Module -Name (Join-Path -Path (Split-Path -Path (Split-Path -Path $script:currentPath -Parent) -Parent) -ChildPath 'SqlServerDSCHelper.psm1') <# .SYNOPSIS diff --git a/DSCResources/MSFT_xSQLServerFirewall/MSFT_xSQLServerFirewall.schema.mof b/DSCResources/MSFT_SqlWindowsFirewall/MSFT_SqlWindowsFirewall.schema.mof similarity index 91% rename from DSCResources/MSFT_xSQLServerFirewall/MSFT_xSQLServerFirewall.schema.mof rename to DSCResources/MSFT_SqlWindowsFirewall/MSFT_SqlWindowsFirewall.schema.mof index 8879b0459..3a189fb47 100644 --- a/DSCResources/MSFT_xSQLServerFirewall/MSFT_xSQLServerFirewall.schema.mof +++ b/DSCResources/MSFT_SqlWindowsFirewall/MSFT_SqlWindowsFirewall.schema.mof @@ -1,5 +1,5 @@ -[ClassVersion("1.0.0.0"), FriendlyName("xSQLServerFirewall")] -class MSFT_xSQLServerFirewall : OMI_BaseResource +[ClassVersion("1.0.0.0"), FriendlyName("SqlWindowsFirewall")] +class MSFT_SqlWindowsFirewall : OMI_BaseResource { [Write, Description("An enumerated value that describes if the SQL firewall rules are is expected to be enabled on the machine.\nPresent {default} \nAbsent \n"), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; [Write, Description("UNC path to the root of the source files for installation.")] String SourcePath; diff --git a/Examples/DSCClusterSqlBuild.ps1 b/Examples/DSCClusterSqlBuild.ps1 index 68510a11e..4bb8abc1a 100644 --- a/Examples/DSCClusterSqlBuild.ps1 +++ b/Examples/DSCClusterSqlBuild.ps1 @@ -36,7 +36,7 @@ foreach ($computer in $computers) Configuration AlwaysOnCluster { Import-DscResource –Module PSDesiredStateConfiguration - Import-DscResource -Module xSQLServer + Import-DscResource -Module SqlServerDSC Import-DscResource -Module xFailoverCluster Node $AllNodes.Where{$_.Role -eq "PrimaryClusterNode" }.NodeName @@ -97,7 +97,7 @@ Configuration AlwaysOnCluster DependsOn = ("[xSqlServerSetup]" + $Node.NodeName) } - xSQLServerMemory ($Node.Nodename) + SqlServerMemory ($Node.Nodename) { Ensure = "Present" DynamicAlloc = $True @@ -105,7 +105,7 @@ Configuration AlwaysOnCluster DependsOn = ("[xSqlServerSetup]" + $Node.NodeName) } - xSQLServerMaxDop($Node.Nodename) + SqlServerMaxDop($Node.Nodename) { Ensure = "Present" DynamicAlloc = $true @@ -154,14 +154,14 @@ Configuration AlwaysOnCluster DependsOn = “[WindowsFeature]RSATClusteringCmdInterface” } - xSQLServerAlwaysOnService($Node.Nodename) + SqlAlwaysOnService($Node.Nodename) { Ensure = "Present" DependsOn = ("[xCluster]ensureCreated"),("[xSqlServerSetup]" + $Node.NodeName) } - xSQLServerEndpoint($Node.Nodename) + SqlServerEndpoint($Node.Nodename) { Ensure = "Present" Port = 5022 @@ -179,7 +179,7 @@ Configuration AlwaysOnCluster AvailabilityGroupSubMask ="255.255.255.0" SetupCredential = $Node.InstallerServiceAccount PsDscRunAsCredential = $Node.InstallerServiceAccount - DependsOn = ("[xSQLServerEndpoint]" + $Node.NodeName),("[xSQLServerAlwaysOnService]" + $Node.NodeName),("[WindowsFeature]ADTools") + DependsOn = ("[SqlServerEndpoint]" + $Node.NodeName),("[SqlAlwaysOnService]" + $Node.NodeName),("[WindowsFeature]ADTools") } } Node $AllNodes.Where{$_.Role -eq "ReplicaServerNode" }.NodeName @@ -233,14 +233,14 @@ Configuration AlwaysOnCluster DependsOn = ("[xSqlServerSetup]" + $Node.NodeName) } - xSQLServerMemory ($Node.Nodename) + SqlServerMemory ($Node.Nodename) { Ensure = "Present" DynamicAlloc = $True DependsOn = ("[xSqlServerSetup]" + $Node.NodeName) } - xSQLServerMaxDop($Node.Nodename) + SqlServerMaxDop($Node.Nodename) { Ensure = "Present" DynamicAlloc = $true @@ -299,13 +299,13 @@ Configuration AlwaysOnCluster DependsOn = "[xWaitForCluster]waitForCluster" } - xSQLServerAlwaysOnService($Node.Nodename) + SqlAlwaysOnService($Node.Nodename) { Ensure = "Present" DependsOn = ("[xCluster]joinCluster"),("[xSqlServerSetup]" + $Node.NodeName) } - xSQLServerEndpoint($Node.Nodename) + SqlServerEndpoint($Node.Nodename) { Ensure = "Present" Port = 5022 @@ -314,13 +314,13 @@ Configuration AlwaysOnCluster DependsOn = ("[xSqlServerSetup]" + $Node.NodeName) } - xWaitForAvailabilityGroup waitforAG + SqlWaitForAvailabilityGroup waitforAG { Name = "MyAG" RetryIntervalSec = 20 RetryCount = 6 - DependsOn = (“[xSQLServerEndpoint]" +$Node.Nodename),(“[xSQLServerAlwaysOnService]" +$Node.Nodename) + DependsOn = (“[SqlServerEndpoint]" +$Node.Nodename),(“[SqlServerAlwaysOnService]" +$Node.Nodename) } xSQLAOGroupJoin ($Node.Nodename) @@ -330,7 +330,7 @@ Configuration AlwaysOnCluster SetupCredential = $Node.InstallerServiceAccount PsDscRunAsCredential = $Node.InstallerServiceAccount - DependsOn = ("[xWaitForAvailabilityGroup]waitforAG") + DependsOn = ("[SqlWaitForAvailabilityGroup]waitforAG") } } diff --git a/Examples/DSCFCISqlBuild.ps1 b/Examples/DSCFCISqlBuild.ps1 index 928963efa..638378b5d 100644 --- a/Examples/DSCFCISqlBuild.ps1 +++ b/Examples/DSCFCISqlBuild.ps1 @@ -5,7 +5,7 @@ $OutputPath = 'F:\DSCConfig' Configuration FCISQL { Import-DscResource –Module PSDesiredStateConfiguration - Import-DscResource -Module xSQLServer + Import-DscResource -Module SqlServerDSC Import-DscResource -Module xFailoverCluster Node $AllNodes.NodeName diff --git a/Examples/DSCSQLBuildEncrypted.ps1 b/Examples/DSCSQLBuildEncrypted.ps1 index 2038c6e92..62dd732e8 100644 --- a/Examples/DSCSQLBuildEncrypted.ps1 +++ b/Examples/DSCSQLBuildEncrypted.ps1 @@ -70,7 +70,7 @@ foreach ($computer in $computers) Configuration SQLBuild { Import-DscResource –Module PSDesiredStateConfiguration - Import-DscResource -Module xSQLServer + Import-DscResource -Module SqlServerDSC Node $AllNodes.NodeName { @@ -115,14 +115,14 @@ Configuration SQLBuild DependsOn = ("[xSqlServerSetup]" + $Node.NodeName) } - xSQLServerMemory ($Node.Nodename) + SqlServerMemory ($Node.Nodename) { Ensure = "Present" DynamicAlloc = $True DependsOn = ("[xSqlServerSetup]" + $Node.NodeName) } - xSQLServerMaxDop($Node.Nodename) + SqlServerMaxDop($Node.Nodename) { Ensure = "Present" DynamicAlloc = $true diff --git a/Examples/DSCSqlBuild.ps1 b/Examples/DSCSqlBuild.ps1 index 360db5c55..f854c2d23 100644 --- a/Examples/DSCSqlBuild.ps1 +++ b/Examples/DSCSqlBuild.ps1 @@ -35,7 +35,7 @@ foreach ($computer in $computers) Configuration SQLBuild { Import-DscResource –ModuleName PSDesiredStateConfiguration - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC Node $AllNodes.NodeName @@ -97,14 +97,14 @@ Configuration SQLBuild DependsOn = ("[xSqlServerSetup]" + $Node.NodeName) } - xSQLServerMemory ($Node.Nodename) + SqlServerMemory ($Node.Nodename) { Ensure = "Present" DynamicAlloc = $True DependsOn = ("[xSqlServerSetup]" + $Node.NodeName) } - xSQLServerMaxDop($Node.Nodename) + SqlServerMaxDop($Node.Nodename) { Ensure = "Present" DynamicAlloc = $true @@ -113,7 +113,7 @@ Configuration SQLBuild } } - xSQLServerEndpoint($Node.Nodename) + SqlServerEndpoint($Node.Nodename) { Ensure = "Present" Port = 5022 diff --git a/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroup/1-CreateAvailabilityGroup.ps1 b/Examples/Resources/SqlAG/1-CreateAvailabilityGroup.ps1 similarity index 84% rename from Examples/Resources/xSQLServerAlwaysOnAvailabilityGroup/1-CreateAvailabilityGroup.ps1 rename to Examples/Resources/SqlAG/1-CreateAvailabilityGroup.ps1 index 033e5f312..9fbc8a575 100644 --- a/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroup/1-CreateAvailabilityGroup.ps1 +++ b/Examples/Resources/SqlAG/1-CreateAvailabilityGroup.ps1 @@ -29,7 +29,7 @@ Configuration Example Node $AllNodes.NodeName { # Adding the required service account to allow the cluster to log into SQL - xSQLServerLogin AddNTServiceClusSvc + SqlServerLogin AddNTServiceClusSvc { Ensure = 'Present' Name = 'NT SERVICE\ClusSvc' @@ -40,9 +40,9 @@ Configuration Example } # Add the required permissions to the cluster service login - xSQLServerPermission AddNTServiceClusSvcPermissions + SqlServerPermission AddNTServiceClusSvcPermissions { - DependsOn = '[xSQLServerLogin]AddNTServiceClusSvc' + DependsOn = '[SqlServerLogin]AddNTServiceClusSvc' Ensure = 'Present' NodeName = $Node.NodeName InstanceName = $Node.SqlInstanceName @@ -52,7 +52,7 @@ Configuration Example } # Create a DatabaseMirroring endpoint - xSQLServerEndpoint HADREndpoint + SqlServerEndpoint HADREndpoint { EndPointName = 'HADR' Ensure = 'Present' @@ -65,13 +65,13 @@ Configuration Example if ( $Node.Role -eq 'PrimaryReplica' ) { # Create the availability group on the instance tagged as the primary replica - xSQLServerAlwaysOnAvailabilityGroup AddTestAG + SqlAG AddTestAG { Ensure = 'Present' Name = 'TestAG' SQLInstanceName = $Node.SQLInstanceName SQLServer = $Node.NodeName - DependsOn = '[xSQLServerEndpoint]HADREndpoint', '[xSQLServerPermission]AddNTServiceClusSvcPermissions' + DependsOn = '[SqlServerEndpoint]HADREndpoint', '[SqlServerPermission]AddNTServiceClusSvcPermissions' PsDscRunAsCredential = $SysAdminAccount } } diff --git a/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroup/2-RemoveAvailabilityGroup.ps1 b/Examples/Resources/SqlAG/2-RemoveAvailabilityGroup.ps1 similarity index 94% rename from Examples/Resources/xSQLServerAlwaysOnAvailabilityGroup/2-RemoveAvailabilityGroup.ps1 rename to Examples/Resources/SqlAG/2-RemoveAvailabilityGroup.ps1 index 719f450a9..e989796dc 100644 --- a/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroup/2-RemoveAvailabilityGroup.ps1 +++ b/Examples/Resources/SqlAG/2-RemoveAvailabilityGroup.ps1 @@ -31,7 +31,7 @@ Configuration Example if ( $Node.Role -eq 'PrimaryReplica' ) { # Create the availability group on the instance tagged as the primary replica - xSQLServerAlwaysOnAvailabilityGroup RemoveTestAG + SqlAG RemoveTestAG { Ensure = 'Absent' Name = 'TestAG' diff --git a/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroup/3-CreateAvailabilityGroupDetailed.ps1 b/Examples/Resources/SqlAG/3-CreateAvailabilityGroupDetailed.ps1 similarity index 90% rename from Examples/Resources/xSQLServerAlwaysOnAvailabilityGroup/3-CreateAvailabilityGroupDetailed.ps1 rename to Examples/Resources/SqlAG/3-CreateAvailabilityGroupDetailed.ps1 index 51ddbe8ee..10f1662f6 100644 --- a/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroup/3-CreateAvailabilityGroupDetailed.ps1 +++ b/Examples/Resources/SqlAG/3-CreateAvailabilityGroupDetailed.ps1 @@ -47,7 +47,7 @@ Configuration Example Node $AllNodes.NodeName { # Adding the required service account to allow the cluster to log into SQL - xSQLServerLogin AddNTServiceClusSvc + SqlServerLogin AddNTServiceClusSvc { Ensure = 'Present' Name = 'NT SERVICE\ClusSvc' @@ -58,9 +58,9 @@ Configuration Example } # Add the required permissions to the cluster service login - xSQLServerPermission AddNTServiceClusSvcPermissions + SqlServerPermission AddNTServiceClusSvcPermissions { - DependsOn = '[xSQLServerLogin]AddNTServiceClusSvc' + DependsOn = '[SqlServerLogin]AddNTServiceClusSvc' Ensure = 'Present' NodeName = $Node.NodeName InstanceName = $Node.SqlInstanceName @@ -70,7 +70,7 @@ Configuration Example } # Create a DatabaseMirroring endpoint - xSQLServerEndpoint HADREndpoint + SqlServerEndpoint HADREndpoint { EndPointName = 'HADR' Ensure = 'Present' @@ -83,7 +83,7 @@ Configuration Example if ( $Node.Role -eq 'PrimaryReplica' ) { # Create the availability group on the instance tagged as the primary replica - xSQLServerAlwaysOnAvailabilityGroup AddTestAG + SqlAG AddTestAG { Ensure = 'Present' Name = 'TestAG' @@ -104,7 +104,7 @@ Configuration Example DatabaseHealthTrigger = $Node.DatabaseHealthTrigger DtcSupportEnabled = $Node.DtcSupportEnabled - DependsOn = '[xSQLServerEndpoint]HADREndpoint', '[xSQLServerPermission]AddNTServiceClusSvcPermissions' + DependsOn = '[SqlServerEndpoint]HADREndpoint', '[SqlServerPermission]AddNTServiceClusSvcPermissions' PsDscRunAsCredential = $SysAdminAccount } } diff --git a/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/1-AddDatabasesToAvailabilityGroup.ps1 b/Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 similarity index 87% rename from Examples/Resources/xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/1-AddDatabasesToAvailabilityGroup.ps1 rename to Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 index b2869c583..bb78cae9c 100644 --- a/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/1-AddDatabasesToAvailabilityGroup.ps1 +++ b/Examples/Resources/SqlAGDatabases/1-AddDatabasesToAvailabilityGroup.ps1 @@ -40,7 +40,7 @@ Configuration Example Node $AllNodes.NodeName { # Adding the required service account to allow the cluster to log into SQL - xSQLServerLogin AddNTServiceClusSvc + SqlServerLogin AddNTServiceClusSvc { Ensure = 'Present' Name = 'NT SERVICE\ClusSvc' @@ -51,9 +51,9 @@ Configuration Example } # Add the required permissions to the cluster service login - xSQLServerPermission AddNTServiceClusSvcPermissions + SqlServerPermission AddNTServiceClusSvcPermissions { - DependsOn = '[xSQLServerLogin]AddNTServiceClusSvc' + DependsOn = '[SqlServerLogin]AddNTServiceClusSvc' Ensure = 'Present' NodeName = $Node.NodeName InstanceName = $Node.SqlInstanceName @@ -63,7 +63,7 @@ Configuration Example } # Create a DatabaseMirroring endpoint - xSQLServerEndpoint HADREndpoint + SqlServerEndpoint HADREndpoint { EndPointName = 'HADR' Ensure = 'Present' @@ -76,13 +76,13 @@ Configuration Example if ( $Node.Role -eq 'PrimaryReplica' ) { # Create the availability group on the instance tagged as the primary replica - xSQLServerAlwaysOnAvailabilityGroup AddTestAG + SqlAG AddTestAG { Ensure = 'Present' Name = $Node.AvailabilityGroupName SQLInstanceName = $Node.SQLInstanceName SQLServer = $Node.NodeName - DependsOn = '[xSQLServerEndpoint]HADREndpoint', '[xSQLServerPermission]AddNTServiceClusSvcPermissions' + DependsOn = '[SqlServerEndpoint]HADREndpoint', '[SqlServerPermission]AddNTServiceClusSvcPermissions' PsDscRunAsCredential = $SysAdminAccount } } @@ -90,7 +90,7 @@ Configuration Example if ( $Node.Role -eq 'SecondaryReplica' ) { # Add the availability group replica to the availability group - xSQLServerAlwaysOnAvailabilityGroupReplica AddReplica + SqlAGReplica AddReplica { Ensure = 'Present' Name = $Node.NodeName @@ -104,7 +104,7 @@ Configuration Example if ( $Node.Role -eq 'PrimaryReplica' ) { - xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership 'TestAGDatabaseMemberships' + SqlAGDatabases 'TestAGDatabaseMemberships' { AvailabilityGroupName = $Node.AvailabilityGroupName BackupPath = '\\SQL1\AgInitialize' diff --git a/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/2-RemoveDatabasesFromAvailabilityGroup.ps1 b/Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 similarity index 86% rename from Examples/Resources/xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/2-RemoveDatabasesFromAvailabilityGroup.ps1 rename to Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 index 1af3cd0b7..e95c8fd6b 100644 --- a/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/2-RemoveDatabasesFromAvailabilityGroup.ps1 +++ b/Examples/Resources/SqlAGDatabases/2-RemoveDatabasesFromAvailabilityGroup.ps1 @@ -35,7 +35,7 @@ Configuration Example Node $AllNodes.NodeName { # Adding the required service account to allow the cluster to log into SQL - xSQLServerLogin AddNTServiceClusSvc + SqlServerLogin AddNTServiceClusSvc { Ensure = 'Present' Name = 'NT SERVICE\ClusSvc' @@ -46,9 +46,9 @@ Configuration Example } # Add the required permissions to the cluster service login - xSQLServerPermission AddNTServiceClusSvcPermissions + SqlServerPermission AddNTServiceClusSvcPermissions { - DependsOn = '[xSQLServerLogin]AddNTServiceClusSvc' + DependsOn = '[SqlServerLogin]AddNTServiceClusSvc' Ensure = 'Present' NodeName = $Node.NodeName InstanceName = $Node.SqlInstanceName @@ -58,7 +58,7 @@ Configuration Example } # Create a DatabaseMirroring endpoint - xSQLServerEndpoint HADREndpoint + SqlServerEndpoint HADREndpoint { EndPointName = 'HADR' Ensure = 'Present' @@ -71,13 +71,13 @@ Configuration Example if ( $Node.Role -eq 'PrimaryReplica' ) { # Create the availability group on the instance tagged as the primary replica - xSQLServerAlwaysOnAvailabilityGroup AddTestAG + SqlAG AddTestAG { Ensure = 'Present' Name = $Node.AvailabilityGroupName SQLInstanceName = $Node.SQLInstanceName SQLServer = $Node.NodeName - DependsOn = '[xSQLServerEndpoint]HADREndpoint', '[xSQLServerPermission]AddNTServiceClusSvcPermissions' + DependsOn = '[SqlServerEndpoint]HADREndpoint', '[SqlServerPermission]AddNTServiceClusSvcPermissions' PsDscRunAsCredential = $SysAdminAccount } } @@ -85,7 +85,7 @@ Configuration Example if ( $Node.Role -eq 'SecondaryReplica' ) { # Add the availability group replica to the availability group - xSQLServerAlwaysOnAvailabilityGroupReplica AddReplica + SqlAGReplica AddReplica { Ensure = 'Present' Name = $Node.NodeName @@ -99,7 +99,7 @@ Configuration Example if ( $Node.Role -eq 'PrimaryReplica' ) { - xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership 'TestAGDatabaseMemberships' + SqlAGDatabases 'TestAGDatabaseMemberships' { AvailabilityGroupName = $Node.AvailabilityGroupName BackupPath = '\\SQL1\AgInitialize' diff --git a/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 b/Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 similarity index 86% rename from Examples/Resources/xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 rename to Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 index a2039e006..2f2193fb1 100644 --- a/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 +++ b/Examples/Resources/SqlAGDatabases/3-MatchDefinedDatabasesInAvailabilityGroup.ps1 @@ -35,7 +35,7 @@ Configuration Example Node $AllNodes.NodeName { # Adding the required service account to allow the cluster to log into SQL - xSQLServerLogin AddNTServiceClusSvc + SqlServerLogin AddNTServiceClusSvc { Ensure = 'Present' Name = 'NT SERVICE\ClusSvc' @@ -46,9 +46,9 @@ Configuration Example } # Add the required permissions to the cluster service login - xSQLServerPermission AddNTServiceClusSvcPermissions + SqlServerPermission AddNTServiceClusSvcPermissions { - DependsOn = '[xSQLServerLogin]AddNTServiceClusSvc' + DependsOn = '[SqlServerLogin]AddNTServiceClusSvc' Ensure = 'Present' NodeName = $Node.NodeName InstanceName = $Node.SqlInstanceName @@ -58,7 +58,7 @@ Configuration Example } # Create a DatabaseMirroring endpoint - xSQLServerEndpoint HADREndpoint + SqlServerEndpoint HADREndpoint { EndPointName = 'HADR' Ensure = 'Present' @@ -71,13 +71,13 @@ Configuration Example if ( $Node.Role -eq 'PrimaryReplica' ) { # Create the availability group on the instance tagged as the primary replica - xSQLServerAlwaysOnAvailabilityGroup AddTestAG + SqlAG AddTestAG { Ensure = 'Present' Name = $Node.AvailabilityGroupName SQLInstanceName = $Node.SQLInstanceName SQLServer = $Node.NodeName - DependsOn = '[xSQLServerEndpoint]HADREndpoint', '[xSQLServerPermission]AddNTServiceClusSvcPermissions' + DependsOn = '[SqlServerEndpoint]HADREndpoint', '[SqlServerPermission]AddNTServiceClusSvcPermissions' PsDscRunAsCredential = $SysAdminAccount } } @@ -85,7 +85,7 @@ Configuration Example if ( $Node.Role -eq 'SecondaryReplica' ) { # Add the availability group replica to the availability group - xSQLServerAlwaysOnAvailabilityGroupReplica AddReplica + SqlAGReplica AddReplica { Ensure = 'Present' Name = $Node.NodeName @@ -99,7 +99,7 @@ Configuration Example if ( $Node.Role -eq 'PrimaryReplica' ) { - xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership 'TestAGDatabaseMemberships' + SqlAGDatabases 'TestAGDatabaseMemberships' { AvailabilityGroupName = $Node.AvailabilityGroupName BackupPath = '\\SQL1\AgInitialize' diff --git a/Examples/Resources/xSQLServerAvailabilityGroupListener/1-AddAvailabilityGroupListenerWithSameNameAsVCO.ps1 b/Examples/Resources/SqlAGListener/1-AddAvailabilityGroupListenerWithSameNameAsVCO.ps1 similarity index 90% rename from Examples/Resources/xSQLServerAvailabilityGroupListener/1-AddAvailabilityGroupListenerWithSameNameAsVCO.ps1 rename to Examples/Resources/SqlAGListener/1-AddAvailabilityGroupListenerWithSameNameAsVCO.ps1 index d93ac05ee..b3a45dd5b 100644 --- a/Examples/Resources/xSQLServerAvailabilityGroupListener/1-AddAvailabilityGroupListenerWithSameNameAsVCO.ps1 +++ b/Examples/Resources/SqlAGListener/1-AddAvailabilityGroupListenerWithSameNameAsVCO.ps1 @@ -16,7 +16,7 @@ Configuration Example node localhost { - xSQLServerAvailabilityGroupListener AvailabilityGroupListenerWithSameNameAsVCO + SqlAGListener AvailabilityGroupListenerWithSameNameAsVCO { Ensure = 'Present' NodeName = 'SQLNODE01.company.local' diff --git a/Examples/Resources/xSQLServerAvailabilityGroupListener/2-AddAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 b/Examples/Resources/SqlAGListener/2-AddAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 similarity index 90% rename from Examples/Resources/xSQLServerAvailabilityGroupListener/2-AddAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 rename to Examples/Resources/SqlAGListener/2-AddAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 index 1d052e55d..db9900aa9 100644 --- a/Examples/Resources/xSQLServerAvailabilityGroupListener/2-AddAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 +++ b/Examples/Resources/SqlAGListener/2-AddAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 @@ -16,7 +16,7 @@ Configuration Example node localhost { - xSQLServerAvailabilityGroupListener AvailabilityGroupListenerWithDifferentNameAsVCO + SqlAGListener AvailabilityGroupListenerWithDifferentNameAsVCO { Ensure = 'Present' NodeName = 'SQLNODE01.company.local' diff --git a/Examples/Resources/xSQLServerAvailabilityGroupListener/3-RemoveAvailabilityGroupListenerWithSameNameAsVCO.ps1 b/Examples/Resources/SqlAGListener/3-RemoveAvailabilityGroupListenerWithSameNameAsVCO.ps1 similarity index 88% rename from Examples/Resources/xSQLServerAvailabilityGroupListener/3-RemoveAvailabilityGroupListenerWithSameNameAsVCO.ps1 rename to Examples/Resources/SqlAGListener/3-RemoveAvailabilityGroupListenerWithSameNameAsVCO.ps1 index 712418e7e..eb37722fd 100644 --- a/Examples/Resources/xSQLServerAvailabilityGroupListener/3-RemoveAvailabilityGroupListenerWithSameNameAsVCO.ps1 +++ b/Examples/Resources/SqlAGListener/3-RemoveAvailabilityGroupListenerWithSameNameAsVCO.ps1 @@ -16,7 +16,7 @@ Configuration Example node localhost { - xSQLServerAvailabilityGroupListener RemoveAvailabilityGroupListenerWithDifferentNameAsVCO + SqlAGListener RemoveAvailabilityGroupListenerWithDifferentNameAsVCO { Ensure = 'Absent' NodeName = 'SQLNODE01.company.local' diff --git a/Examples/Resources/xSQLServerAvailabilityGroupListener/4-RemoveAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 b/Examples/Resources/SqlAGListener/4-RemoveAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 similarity index 88% rename from Examples/Resources/xSQLServerAvailabilityGroupListener/4-RemoveAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 rename to Examples/Resources/SqlAGListener/4-RemoveAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 index e20f3b591..2042fc973 100644 --- a/Examples/Resources/xSQLServerAvailabilityGroupListener/4-RemoveAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 +++ b/Examples/Resources/SqlAGListener/4-RemoveAvailabilityGroupListenerWithDifferentNameAsVCO.ps1 @@ -16,7 +16,7 @@ Configuration Example node localhost { - xSQLServerAvailabilityGroupListener RemoveAvailabilityGroupListenerWithSameNameAsVCO + SqlAGListener RemoveAvailabilityGroupListenerWithSameNameAsVCO { Ensure = 'Absent' NodeName = 'SQLNODE01.company.local' diff --git a/Examples/Resources/xSQLServerAvailabilityGroupListener/5-AddAvailabilityGroupListenerUsingDHCPWithDefaultServerSubnet.ps1 b/Examples/Resources/SqlAGListener/5-AddAvailabilityGroupListenerUsingDHCPWithDefaultServerSubnet.ps1 similarity index 91% rename from Examples/Resources/xSQLServerAvailabilityGroupListener/5-AddAvailabilityGroupListenerUsingDHCPWithDefaultServerSubnet.ps1 rename to Examples/Resources/SqlAGListener/5-AddAvailabilityGroupListenerUsingDHCPWithDefaultServerSubnet.ps1 index 64fc72568..b6209e1ca 100644 --- a/Examples/Resources/xSQLServerAvailabilityGroupListener/5-AddAvailabilityGroupListenerUsingDHCPWithDefaultServerSubnet.ps1 +++ b/Examples/Resources/SqlAGListener/5-AddAvailabilityGroupListenerUsingDHCPWithDefaultServerSubnet.ps1 @@ -16,7 +16,7 @@ Configuration Example node localhost { - xSQLServerAvailabilityGroupListener AvailabilityGroupListenerWithSameNameAsVCO + SqlAGListener AvailabilityGroupListenerWithSameNameAsVCO { Ensure = 'Present' NodeName = 'SQLNODE01.company.local' diff --git a/Examples/Resources/xSQLServerAvailabilityGroupListener/6-AddAvailabilityGroupListenerUsingDHCPWithSpecificSubnet.ps1 b/Examples/Resources/SqlAGListener/6-AddAvailabilityGroupListenerUsingDHCPWithSpecificSubnet.ps1 similarity index 90% rename from Examples/Resources/xSQLServerAvailabilityGroupListener/6-AddAvailabilityGroupListenerUsingDHCPWithSpecificSubnet.ps1 rename to Examples/Resources/SqlAGListener/6-AddAvailabilityGroupListenerUsingDHCPWithSpecificSubnet.ps1 index b547ff066..f0de3d2b6 100644 --- a/Examples/Resources/xSQLServerAvailabilityGroupListener/6-AddAvailabilityGroupListenerUsingDHCPWithSpecificSubnet.ps1 +++ b/Examples/Resources/SqlAGListener/6-AddAvailabilityGroupListenerUsingDHCPWithSpecificSubnet.ps1 @@ -16,7 +16,7 @@ Configuration Example node localhost { - xSQLServerAvailabilityGroupListener AvailabilityGroupListenerWithSameNameAsVCO + SqlAGListener AvailabilityGroupListenerWithSameNameAsVCO { Ensure = 'Present' NodeName = 'SQLNODE01.company.local' diff --git a/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroupReplica/1-CreateAvailabilityGroupReplica.ps1 b/Examples/Resources/SqlAGReplica/1-CreateAvailabilityGroupReplica.ps1 similarity index 88% rename from Examples/Resources/xSQLServerAlwaysOnAvailabilityGroupReplica/1-CreateAvailabilityGroupReplica.ps1 rename to Examples/Resources/SqlAGReplica/1-CreateAvailabilityGroupReplica.ps1 index 05805026e..72025c1ca 100644 --- a/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroupReplica/1-CreateAvailabilityGroupReplica.ps1 +++ b/Examples/Resources/SqlAGReplica/1-CreateAvailabilityGroupReplica.ps1 @@ -42,7 +42,7 @@ Configuration Example Node $AllNodes.NodeName { # Adding the required service account to allow the cluster to log into SQL - xSQLServerLogin AddNTServiceClusSvc + SqlServerLogin AddNTServiceClusSvc { Ensure = 'Present' Name = 'NT SERVICE\ClusSvc' @@ -53,9 +53,9 @@ Configuration Example } # Add the required permissions to the cluster service login - xSQLServerPermission AddNTServiceClusSvcPermissions + SqlServerPermission AddNTServiceClusSvcPermissions { - DependsOn = '[xSQLServerLogin]AddNTServiceClusSvc' + DependsOn = '[SqlServerLogin]AddNTServiceClusSvc' Ensure = 'Present' NodeName = $Node.NodeName InstanceName = $Node.SqlInstanceName @@ -65,7 +65,7 @@ Configuration Example } # Create a DatabaseMirroring endpoint - xSQLServerEndpoint HADREndpoint + SqlServerEndpoint HADREndpoint { EndPointName = 'HADR' Ensure = 'Present' @@ -78,13 +78,13 @@ Configuration Example if ( $Node.Role -eq 'PrimaryReplica' ) { # Create the availability group on the instance tagged as the primary replica - xSQLServerAlwaysOnAvailabilityGroup AddTestAG + SqlAG AddTestAG { Ensure = 'Present' Name = $Node.AvailabilityGroupName SQLInstanceName = $Node.SQLInstanceName SQLServer = $Node.NodeName - DependsOn = '[xSQLServerEndpoint]HADREndpoint', '[xSQLServerPermission]AddNTServiceClusSvcPermissions' + DependsOn = '[SqlServerEndpoint]HADREndpoint', '[SqlServerPermission]AddNTServiceClusSvcPermissions' PsDscRunAsCredential = $SysAdminAccount } } @@ -92,7 +92,7 @@ Configuration Example if ( $Node.Role -eq 'SecondaryReplica' ) { # Add the availability group replica to the availability group - xSQLServerAlwaysOnAvailabilityGroupReplica AddReplica + SqlAGReplica AddReplica { Ensure = 'Present' Name = $Node.NodeName diff --git a/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroupReplica/2-RemoveAvailabilityGroupReplica.ps1 b/Examples/Resources/SqlAGReplica/2-RemoveAvailabilityGroupReplica.ps1 similarity index 87% rename from Examples/Resources/xSQLServerAlwaysOnAvailabilityGroupReplica/2-RemoveAvailabilityGroupReplica.ps1 rename to Examples/Resources/SqlAGReplica/2-RemoveAvailabilityGroupReplica.ps1 index 3634f7f50..d3c09dfc3 100644 --- a/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroupReplica/2-RemoveAvailabilityGroupReplica.ps1 +++ b/Examples/Resources/SqlAGReplica/2-RemoveAvailabilityGroupReplica.ps1 @@ -35,7 +35,7 @@ Configuration Example Node $AllNodes.NodeName { # Adding the required service account to allow the cluster to log into SQL - xSQLServerLogin AddNTServiceClusSvc + SqlServerLogin AddNTServiceClusSvc { Ensure = 'Present' Name = 'NT SERVICE\ClusSvc' @@ -46,9 +46,9 @@ Configuration Example } # Add the required permissions to the cluster service login - xSQLServerPermission AddNTServiceClusSvcPermissions + SqlServerPermission AddNTServiceClusSvcPermissions { - DependsOn = '[xSQLServerLogin]AddNTServiceClusSvc' + DependsOn = '[SqlServerLogin]AddNTServiceClusSvc' Ensure = 'Present' NodeName = $Node.NodeName InstanceName = $Node.SqlInstanceName @@ -58,7 +58,7 @@ Configuration Example } # Create a DatabaseMirroring endpoint - xSQLServerEndpoint HADREndpoint + SqlServerEndpoint HADREndpoint { EndPointName = 'HADR' Ensure = 'Present' @@ -71,13 +71,13 @@ Configuration Example if ( $Node.Role -eq 'PrimaryReplica' ) { # Create the availability group on the instance tagged as the primary replica - xSQLServerAlwaysOnAvailabilityGroup AddTestAG + SqlAG AddTestAG { Ensure = 'Present' Name = $Node.AvailabilityGroupName SQLInstanceName = $Node.SQLInstanceName SQLServer = $Node.NodeName - DependsOn = '[xSQLServerEndpoint]HADREndpoint', '[xSQLServerPermission]AddNTServiceClusSvcPermissions' + DependsOn = '[SqlServerEndpoint]HADREndpoint', '[SqlServerPermission]AddNTServiceClusSvcPermissions' PsDscRunAsCredential = $SysAdminAccount } } @@ -85,7 +85,7 @@ Configuration Example if ( $Node.Role -eq 'SecondaryReplica' ) { # Add the availability group replica to the availability group - xSQLServerAlwaysOnAvailabilityGroupReplica AddReplica + SqlAGReplica AddReplica { Ensure = 'Absent' Name = $Node.NodeName diff --git a/Examples/Resources/xSQLServerAlias/1-AddSQLServerAlias.ps1 b/Examples/Resources/SqlAlias/1-AddSqlAlias.ps1 similarity index 86% rename from Examples/Resources/xSQLServerAlias/1-AddSQLServerAlias.ps1 rename to Examples/Resources/SqlAlias/1-AddSqlAlias.ps1 index 9654e65ec..f92417fb8 100644 --- a/Examples/Resources/xSQLServerAlias/1-AddSQLServerAlias.ps1 +++ b/Examples/Resources/SqlAlias/1-AddSqlAlias.ps1 @@ -12,10 +12,10 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDSC node localhost { - xSQLServerAlias Add_SqlAlias_TCP + SqlAlias Add_SqlAlias_TCP { Ensure = 'Present' Name = 'SQLDSC-TCP' @@ -25,7 +25,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerAlias Add_SqlAlias_TCPUseDynamicTcpPort + SqlAlias Add_SqlAlias_TCPUseDynamicTcpPort { Ensure = 'Present' Name = 'SQLDSC-DYN' @@ -35,7 +35,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerAlias Add_SqlAlias_NP + SqlAlias Add_SqlAlias_NP { Ensure = 'Present' Name = 'SQLDSC-NP' diff --git a/Examples/Resources/xSQLServerAlias/2-RemoveSQLServerAlias.ps1 b/Examples/Resources/SqlAlias/2-RemoveSqlAlias.ps1 similarity index 86% rename from Examples/Resources/xSQLServerAlias/2-RemoveSQLServerAlias.ps1 rename to Examples/Resources/SqlAlias/2-RemoveSqlAlias.ps1 index 986105874..3a7b4d95d 100644 --- a/Examples/Resources/xSQLServerAlias/2-RemoveSQLServerAlias.ps1 +++ b/Examples/Resources/SqlAlias/2-RemoveSqlAlias.ps1 @@ -12,10 +12,10 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSqlServer + Import-DscResource -ModuleName SqlServerDSC node localhost { - xSQLServerAlias Remove_SqlAlias_TCP + SqlAlias Remove_SqlAlias_TCP { Ensure = 'Absent' Name = 'SQLDSC-TCP' @@ -25,7 +25,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerAlias Remove_SqlAlias_NP + SqlAlias Remove_SqlAlias_NP { Ensure = 'Absent' Name = 'SQLDSC-NP' diff --git a/Examples/Resources/xSQLServerAlwaysOnService/1-EnableAlwaysOn.ps1 b/Examples/Resources/SqlAlwaysOnService/1-EnableAlwaysOn.ps1 similarity index 92% rename from Examples/Resources/xSQLServerAlwaysOnService/1-EnableAlwaysOn.ps1 rename to Examples/Resources/SqlAlwaysOnService/1-EnableAlwaysOn.ps1 index 9bc907218..6429c72d4 100644 --- a/Examples/Resources/xSQLServerAlwaysOnService/1-EnableAlwaysOn.ps1 +++ b/Examples/Resources/SqlAlwaysOnService/1-EnableAlwaysOn.ps1 @@ -17,7 +17,7 @@ Configuration Example node localhost { - xSQLServerAlwaysOnService 'EnableAlwaysOn' + SqlAlwaysOnService 'EnableAlwaysOn' { Ensure = 'Present' SQLServer = 'SP23-VM-SQL1' diff --git a/Examples/Resources/xSQLServerAlwaysOnService/2-DisableAlwaysOn.ps1 b/Examples/Resources/SqlAlwaysOnService/2-DisableAlwaysOn.ps1 similarity index 92% rename from Examples/Resources/xSQLServerAlwaysOnService/2-DisableAlwaysOn.ps1 rename to Examples/Resources/SqlAlwaysOnService/2-DisableAlwaysOn.ps1 index 9d45fab51..86189a9a3 100644 --- a/Examples/Resources/xSQLServerAlwaysOnService/2-DisableAlwaysOn.ps1 +++ b/Examples/Resources/SqlAlwaysOnService/2-DisableAlwaysOn.ps1 @@ -17,7 +17,7 @@ Configuration Example node localhost { - xSQLServerAlwaysOnService 'DisableAlwaysOn' + SqlAlwaysOnService 'DisableAlwaysOn' { Ensure = 'Absent' SQLServer = 'SP23-VM-SQL1' diff --git a/Examples/Resources/xSQLServerDatabase/1-CreateDatabase.ps1 b/Examples/Resources/SqlDatabase/1-CreateDatabase.ps1 similarity index 89% rename from Examples/Resources/xSQLServerDatabase/1-CreateDatabase.ps1 rename to Examples/Resources/SqlDatabase/1-CreateDatabase.ps1 index 0bd9e3c29..32d08d391 100644 --- a/Examples/Resources/xSQLServerDatabase/1-CreateDatabase.ps1 +++ b/Examples/Resources/SqlDatabase/1-CreateDatabase.ps1 @@ -20,7 +20,7 @@ Configuration Example node localhost { - xSQLServerDatabase Create_Database + SqlDatabase Create_Database { Ensure = 'Present' SQLServer = 'SQLServer' @@ -28,7 +28,7 @@ Configuration Example Name = 'Contoso' } - xSQLServerDatabase Create_Database_with_different_collation + SqlDatabase Create_Database_with_different_collation { Ensure = 'Present' SQLServer = 'SQLServer' diff --git a/Examples/Resources/xSQLServerDatabase/2-DeleteDatabase.ps1 b/Examples/Resources/SqlDatabase/2-DeleteDatabase.ps1 similarity index 93% rename from Examples/Resources/xSQLServerDatabase/2-DeleteDatabase.ps1 rename to Examples/Resources/SqlDatabase/2-DeleteDatabase.ps1 index 34bbca64e..31b3c4269 100644 --- a/Examples/Resources/xSQLServerDatabase/2-DeleteDatabase.ps1 +++ b/Examples/Resources/SqlDatabase/2-DeleteDatabase.ps1 @@ -17,7 +17,7 @@ Configuration Example node localhost { - xSQLServerDatabase Delete_Database + SqlDatabase Delete_Database { Ensure = 'Absent' SQLServer = 'SQLServer' diff --git a/Examples/Resources/xSQLServerDatabaseDefaultLocation/1-SetDatabaseDefaultLocation.ps1 b/Examples/Resources/SqlDatabaseDefaultLocation/1-SetDatabaseDefaultLocation.ps1 similarity index 88% rename from Examples/Resources/xSQLServerDatabaseDefaultLocation/1-SetDatabaseDefaultLocation.ps1 rename to Examples/Resources/SqlDatabaseDefaultLocation/1-SetDatabaseDefaultLocation.ps1 index 86e289a07..80840d8a4 100644 --- a/Examples/Resources/xSQLServerDatabaseDefaultLocation/1-SetDatabaseDefaultLocation.ps1 +++ b/Examples/Resources/SqlDatabaseDefaultLocation/1-SetDatabaseDefaultLocation.ps1 @@ -20,7 +20,7 @@ Configuration Example node localhost { - xSQLServerDatabaseDefaultLocation Set_SqlDatabaseDefaultDirectory_Data + SqlDatabaseDefaultLocation Set_SqlDatabaseDefaultDirectory_Data { SQLServer = 'SQLServer' SQLInstanceName = 'DSC' @@ -30,7 +30,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerDatabaseDefaultLocation Set_SqlDatabaseDefaultDirectory_Log + SqlDatabaseDefaultLocation Set_SqlDatabaseDefaultDirectory_Log { SQLServer = 'SQLServer' SQLInstanceName = 'DSC' @@ -40,7 +40,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerDatabaseDefaultLocation Set_SqlDatabaseDefaultDirectory_Backup + SqlDatabaseDefaultLocation Set_SqlDatabaseDefaultDirectory_Backup { SQLServer = 'SQLServer' SQLInstanceName = 'DSC' diff --git a/Examples/Resources/xSQLServerDatabaseOwner/1-SetDatabaseOwner.ps1 b/Examples/Resources/SqlDatabaseOwner/1-SetDatabaseOwner.ps1 similarity index 89% rename from Examples/Resources/xSQLServerDatabaseOwner/1-SetDatabaseOwner.ps1 rename to Examples/Resources/SqlDatabaseOwner/1-SetDatabaseOwner.ps1 index 6b6e00794..7b62f77fd 100644 --- a/Examples/Resources/xSQLServerDatabaseOwner/1-SetDatabaseOwner.ps1 +++ b/Examples/Resources/SqlDatabaseOwner/1-SetDatabaseOwner.ps1 @@ -17,7 +17,7 @@ Configuration Example node localhost { - xSQLServerLogin Add_SqlServerLogin_SQLAdmin + SqlServerLogin Add_SqlServerLogin_SQLAdmin { Ensure = 'Present' Name = 'CONTOSO\SQLAdmin' @@ -27,7 +27,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerDatabaseOwner Set_SqlDatabaseOwner_SQLAdmin + SqlDatabaseOwner Set_SqlDatabaseOwner_SQLAdmin { Name = 'CONTOSO\SQLAdmin' Database = 'AdventureWorks' diff --git a/Examples/Resources/xSQLServerDatabasePermission/1-GrantDatabasePermissions.ps1 b/Examples/Resources/SqlDatabasePermission/1-GrantDatabasePermissions.ps1 similarity index 86% rename from Examples/Resources/xSQLServerDatabasePermission/1-GrantDatabasePermissions.ps1 rename to Examples/Resources/SqlDatabasePermission/1-GrantDatabasePermissions.ps1 index 209b22059..6061e75cd 100644 --- a/Examples/Resources/xSQLServerDatabasePermission/1-GrantDatabasePermissions.ps1 +++ b/Examples/Resources/SqlDatabasePermission/1-GrantDatabasePermissions.ps1 @@ -15,7 +15,7 @@ Configuration Example Import-DscResource -ModuleName xSqlServer node localhost { - xSQLServerLogin Add_SqlServerLogin_SQLAdmin + SqlServerLogin Add_SqlServerLogin_SQLAdmin { Ensure = 'Present' Name = 'CONTOSO\SQLAdmin' @@ -25,7 +25,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerLogin Add_SqlServerLogin_SQLUser + SqlServerLogin Add_SqlServerLogin_SQLUser { Ensure = 'Present' Name = 'CONTOSO\SQLUser' @@ -35,7 +35,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerDatabasePermission Grant_SqlDatabasePermissions_SQLAdmin_Db01 + SqlDatabasePermission Grant_SqlDatabasePermissions_SQLAdmin_Db01 { Ensure = 'Present' Name = 'CONTOSO\SQLAdmin' @@ -47,7 +47,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerDatabasePermission Grant_SqlDatabasePermissions_SQLUser_Db01 + SqlDatabasePermission Grant_SqlDatabasePermissions_SQLUser_Db01 { Ensure = 'Present' Name = 'CONTOSO\SQLUser' @@ -59,7 +59,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerDatabasePermission Grant_SqlDatabasePermissions_SQLAdmin_Db02 + SqlDatabasePermission Grant_SqlDatabasePermissions_SQLAdmin_Db02 { Ensure = 'Present' Name = 'CONTOSO\SQLAdmin' diff --git a/Examples/Resources/xSQLServerDatabasePermission/2-RevokeDatabasePermissions.ps1 b/Examples/Resources/SqlDatabasePermission/2-RevokeDatabasePermissions.ps1 similarity index 88% rename from Examples/Resources/xSQLServerDatabasePermission/2-RevokeDatabasePermissions.ps1 rename to Examples/Resources/SqlDatabasePermission/2-RevokeDatabasePermissions.ps1 index 701fed79e..95cb82d3e 100644 --- a/Examples/Resources/xSQLServerDatabasePermission/2-RevokeDatabasePermissions.ps1 +++ b/Examples/Resources/SqlDatabasePermission/2-RevokeDatabasePermissions.ps1 @@ -15,7 +15,7 @@ Configuration Example Import-DscResource -ModuleName xSqlServer node localhost { - xSQLServerDatabasePermission RevokeGrant_SqlDatabasePermissions_SQLAdmin + SqlDatabasePermission RevokeGrant_SqlDatabasePermissions_SQLAdmin { Ensure = 'Absent' Name = 'CONTOSO\SQLAdmin' @@ -27,7 +27,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerDatabasePermission RevokeDeny_SqlDatabasePermissions_SQLAdmin + SqlDatabasePermission RevokeDeny_SqlDatabasePermissions_SQLAdmin { Ensure = 'Absent' Name = 'CONTOSO\SQLAdmin' diff --git a/Examples/Resources/xSQLServerDatabasePermission/3-DenyDatabasePermissions.ps1 b/Examples/Resources/SqlDatabasePermission/3-DenyDatabasePermissions.ps1 similarity index 86% rename from Examples/Resources/xSQLServerDatabasePermission/3-DenyDatabasePermissions.ps1 rename to Examples/Resources/SqlDatabasePermission/3-DenyDatabasePermissions.ps1 index 940826148..8155669b0 100644 --- a/Examples/Resources/xSQLServerDatabasePermission/3-DenyDatabasePermissions.ps1 +++ b/Examples/Resources/SqlDatabasePermission/3-DenyDatabasePermissions.ps1 @@ -15,7 +15,7 @@ Configuration Example Import-DscResource -ModuleName xSqlServer node localhost { - xSQLServerLogin Add_SqlServerLogin_SQLAdmin + SqlServerLogin Add_SqlServerLogin_SQLAdmin { Ensure = 'Present' Name = 'CONTOSO\SQLAdmin' @@ -25,7 +25,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerLogin Add_SqlServerLogin_SQLUser + SqlServerLogin Add_SqlServerLogin_SQLUser { Ensure = 'Present' Name = 'CONTOSO\SQLUser' @@ -35,7 +35,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerDatabasePermission Deny_SqlDatabasePermissions_SQLAdmin_Db01 + SqlDatabasePermission Deny_SqlDatabasePermissions_SQLAdmin_Db01 { Ensure = 'Present' Name = 'CONTOSO\SQLAdmin' @@ -47,7 +47,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerDatabasePermission Deny_SqlDatabasePermissions_SQLUser_Db01 + SqlDatabasePermission Deny_SqlDatabasePermissions_SQLUser_Db01 { Ensure = 'Present' Name = 'CONTOSO\SQLUser' @@ -59,7 +59,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerDatabasePermission Deny_SqlDatabasePermissions_SQLAdmin_Db02 + SqlDatabasePermission Deny_SqlDatabasePermissions_SQLAdmin_Db02 { Ensure = 'Present' Name = 'CONTOSO\SQLAdmin' diff --git a/Examples/Resources/xSQLServerDatabaseRecoveryModel/1-SetDatabaseRecoveryModel.ps1 b/Examples/Resources/SqlDatabaseRecoveryModel/1-SetDatabaseRecoveryModel.ps1 similarity index 83% rename from Examples/Resources/xSQLServerDatabaseRecoveryModel/1-SetDatabaseRecoveryModel.ps1 rename to Examples/Resources/SqlDatabaseRecoveryModel/1-SetDatabaseRecoveryModel.ps1 index d8682edfc..9422df0fd 100644 --- a/Examples/Resources/xSQLServerDatabaseRecoveryModel/1-SetDatabaseRecoveryModel.ps1 +++ b/Examples/Resources/SqlDatabaseRecoveryModel/1-SetDatabaseRecoveryModel.ps1 @@ -18,7 +18,7 @@ Configuration Example node localhost { - xSQLServerDatabase Add_SqlDatabaseAdventureworks + SqlDatabase Add_SqlDatabaseAdventureworks { Ensure = 'Present' Name = 'Adventureworks' @@ -27,7 +27,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerDatabase Add_SqlDatabaseAdventureWorks2012 + SqlDatabase Add_SqlDatabaseAdventureWorks2012 { Ensure = 'Present' Name = 'AdventureWorks2012' @@ -36,7 +36,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerDatabaseRecoveryModel Set_SqlDatabaseRecoveryModel_Adventureworks + SqlDatabaseRecoveryModel Set_SqlDatabaseRecoveryModel_Adventureworks { Name = 'Adventureworks' RecoveryModel = 'Full' @@ -45,7 +45,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerDatabaseRecoveryModel Set_SqlDatabaseRecoveryModel_AdventureWorks2012 + SqlDatabaseRecoveryModel Set_SqlDatabaseRecoveryModel_AdventureWorks2012 { Name = 'AdventureWorks2012' RecoveryModel = 'Simple' diff --git a/Examples/Resources/xSQLServerDatabaseRole/1-AddDatabaseRole.ps1 b/Examples/Resources/SqlDatabaseRole/1-AddDatabaseRole.ps1 similarity index 94% rename from Examples/Resources/xSQLServerDatabaseRole/1-AddDatabaseRole.ps1 rename to Examples/Resources/SqlDatabaseRole/1-AddDatabaseRole.ps1 index b461a5bf2..c5130da0d 100644 --- a/Examples/Resources/xSQLServerDatabaseRole/1-AddDatabaseRole.ps1 +++ b/Examples/Resources/SqlDatabaseRole/1-AddDatabaseRole.ps1 @@ -17,7 +17,7 @@ Configuration Example node localhost { - xSQLServerDatabaseRole Add_Database_Role + SqlDatabaseRole Add_Database_Role { Ensure = 'Present' SQLServer = 'SQLServer' diff --git a/Examples/Resources/xSQLServerDatabaseRole/2-RemoveDatabaseRole.ps1 b/Examples/Resources/SqlDatabaseRole/2-RemoveDatabaseRole.ps1 similarity index 93% rename from Examples/Resources/xSQLServerDatabaseRole/2-RemoveDatabaseRole.ps1 rename to Examples/Resources/SqlDatabaseRole/2-RemoveDatabaseRole.ps1 index 97e6a769a..d80d4323b 100644 --- a/Examples/Resources/xSQLServerDatabaseRole/2-RemoveDatabaseRole.ps1 +++ b/Examples/Resources/SqlDatabaseRole/2-RemoveDatabaseRole.ps1 @@ -17,7 +17,7 @@ Configuration Example node localhost { - xSQLServerDatabaseRole Remove_Database_Role + SqlDatabaseRole Remove_Database_Role { Ensure = 'Absent' SQLServer = 'SQLServer' diff --git a/Examples/Resources/xSQLServerRSConfig/1-DefaultConfiguration.ps1 b/Examples/Resources/SqlRS/1-DefaultConfiguration.ps1 similarity index 88% rename from Examples/Resources/xSQLServerRSConfig/1-DefaultConfiguration.ps1 rename to Examples/Resources/SqlRS/1-DefaultConfiguration.ps1 index b780ed6b8..4d45e8ca7 100644 --- a/Examples/Resources/xSQLServerRSConfig/1-DefaultConfiguration.ps1 +++ b/Examples/Resources/SqlRS/1-DefaultConfiguration.ps1 @@ -1,22 +1,22 @@ -<# -.EXAMPLE - This example performs a default SSRS configuration. It will initialize SSRS - and register default Report Server Web Service and Report Manager URLs: - - http://localhost:80/ReportServer (Report Server Web Service) - - http://localhost:80/Reports (Report Manager) -#> -Configuration Example -{ - Import-DscResource -ModuleName xSqlServer - - node localhost { - xSQLServerRSConfig DefaultConfiguration - { - InstanceName = 'MSSQLSERVER' - RSSQLServer = 'localhost' - RSSQLInstanceName = 'MSSQLSERVER' - } - } -} +<# +.EXAMPLE + This example performs a default SSRS configuration. It will initialize SSRS + and register default Report Server Web Service and Report Manager URLs: + + http://localhost:80/ReportServer (Report Server Web Service) + + http://localhost:80/Reports (Report Manager) +#> +Configuration Example +{ + Import-DscResource -ModuleName xSqlServer + + node localhost { + SqlRS DefaultConfiguration + { + InstanceName = 'MSSQLSERVER' + RSSQLServer = 'localhost' + RSSQLInstanceName = 'MSSQLSERVER' + } + } +} diff --git a/Examples/Resources/xSQLServerRSConfig/2-CustomConfiguration.ps1 b/Examples/Resources/SqlRS/2-CustomConfiguration.ps1 similarity index 92% rename from Examples/Resources/xSQLServerRSConfig/2-CustomConfiguration.ps1 rename to Examples/Resources/SqlRS/2-CustomConfiguration.ps1 index 2c616b763..f210f2c72 100644 --- a/Examples/Resources/xSQLServerRSConfig/2-CustomConfiguration.ps1 +++ b/Examples/Resources/SqlRS/2-CustomConfiguration.ps1 @@ -1,31 +1,31 @@ -<# -.EXAMPLE - This example performs a custom SSRS configuration. It will initialize SSRS - and register custom Report Server Web Service and Report Manager URLs: - - http://localhost:80/MyReportServer - https://localhost:443/MyReportServer (Report Server Web Service) - - http://localhost:80/MyReports - https://localhost:443/MyReports (Report Manager) - - Please note: this resource does not currently handle SSL bindings for HTTPS - endpoints. -#> -Configuration Example -{ - Import-DscResource -ModuleName xSqlServer - - node localhost { - xSQLServerRSConfig DefaultConfiguration - { - InstanceName = 'MSSQLSERVER' - RSSQLServer = 'localhost' - RSSQLInstanceName = 'MSSQLSERVER' - ReportServerVirtualDirectory = 'MyReportServer' - ReportsVirtualDirectory = 'MyReports' - ReportServerReservedUrl = @('http://+:80', 'https://+:443') - ReportsReservedUrl = @('http://+:80', 'https://+:443') - } - } -} +<# +.EXAMPLE + This example performs a custom SSRS configuration. It will initialize SSRS + and register custom Report Server Web Service and Report Manager URLs: + + http://localhost:80/MyReportServer + https://localhost:443/MyReportServer (Report Server Web Service) + + http://localhost:80/MyReports + https://localhost:443/MyReports (Report Manager) + + Please note: this resource does not currently handle SSL bindings for HTTPS + endpoints. +#> +Configuration Example +{ + Import-DscResource -ModuleName xSqlServer + + node localhost { + SqlRS DefaultConfiguration + { + InstanceName = 'MSSQLSERVER' + RSSQLServer = 'localhost' + RSSQLInstanceName = 'MSSQLSERVER' + ReportServerVirtualDirectory = 'MyReportServer' + ReportsVirtualDirectory = 'MyReports' + ReportServerReservedUrl = @('http://+:80', 'https://+:443') + ReportsReservedUrl = @('http://+:80', 'https://+:443') + } + } +} diff --git a/Examples/Resources/xSQLServerScript/1-RunScriptUsingSQLAuthentication.ps1 b/Examples/Resources/SqlScript/1-RunScriptUsingSQLAuthentication.ps1 similarity index 88% rename from Examples/Resources/xSQLServerScript/1-RunScriptUsingSQLAuthentication.ps1 rename to Examples/Resources/SqlScript/1-RunScriptUsingSQLAuthentication.ps1 index 659c076f4..e88a04a08 100644 --- a/Examples/Resources/xSQLServerScript/1-RunScriptUsingSQLAuthentication.ps1 +++ b/Examples/Resources/SqlScript/1-RunScriptUsingSQLAuthentication.ps1 @@ -11,11 +11,11 @@ Configuration Example $SqlCredential ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC Node localhost { - xSQLServerScript 'RunSQLScript' + SqlScript 'RunSQLScript' { ServerInstance = 'localhost\SQL2016' Credential = $SqlCredential diff --git a/Examples/Resources/xSQLServerScript/2-RunScriptUsingWindowsAuthentication.ps1 b/Examples/Resources/SqlScript/2-RunScriptUsingWindowsAuthentication.ps1 similarity index 89% rename from Examples/Resources/xSQLServerScript/2-RunScriptUsingWindowsAuthentication.ps1 rename to Examples/Resources/SqlScript/2-RunScriptUsingWindowsAuthentication.ps1 index 3e5664c7b..5eca83fdf 100644 --- a/Examples/Resources/xSQLServerScript/2-RunScriptUsingWindowsAuthentication.ps1 +++ b/Examples/Resources/SqlScript/2-RunScriptUsingWindowsAuthentication.ps1 @@ -12,11 +12,11 @@ Configuration Example $WindowsCredential ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC Node localhost { - xSQLServerScript 'RunSQLScript-AsSYSTEM' + SqlScript 'RunSQLScript-AsSYSTEM' { ServerInstance = 'localhost\SQL2016' @@ -26,7 +26,7 @@ Configuration Example Variable = @("FilePath=C:\temp\log\AuditFiles") } - xSQLServerScript 'RunSQLScript-AsUSER' + SqlScript 'RunSQLScript-AsUSER' { ServerInstance = 'localhost\SQL2016' @@ -38,7 +38,7 @@ Configuration Example PsDscRunAsCredential = $WindowsCredential } - xSQLServerScript 'RunSQLScript-With30SecondTimeout' + SqlScript 'RunSQLScript-With30SecondTimeout' { ServerInstance = 'localhost\SQL2016' diff --git a/Examples/Resources/xSQLServerConfiguration/1-ConfigureTwoInstancesOnTheSameServerToEnableClr.ps1 b/Examples/Resources/SqlServerConfiguration/1-ConfigureTwoInstancesOnTheSameServerToEnableClr.ps1 similarity index 92% rename from Examples/Resources/xSQLServerConfiguration/1-ConfigureTwoInstancesOnTheSameServerToEnableClr.ps1 rename to Examples/Resources/SqlServerConfiguration/1-ConfigureTwoInstancesOnTheSameServerToEnableClr.ps1 index 25d1152e6..b5d1223ba 100644 --- a/Examples/Resources/xSQLServerConfiguration/1-ConfigureTwoInstancesOnTheSameServerToEnableClr.ps1 +++ b/Examples/Resources/SqlServerConfiguration/1-ConfigureTwoInstancesOnTheSameServerToEnableClr.ps1 @@ -23,7 +23,7 @@ Configuration Example { foreach ($SQLInstance in $node.SQLInstances) { - xSQLServerConfiguration ('SQLConfigCLR_{0}' -f $SQLInstance) + SqlServerConfiguration ('SQLConfigCLR_{0}' -f $SQLInstance) { SQLServer = $node.NodeName SQLInstanceName = $SQLInstance diff --git a/Examples/Resources/xSQLServerConfiguration/2-ConfigureInstanceToEnablePriorityBoost.ps1 b/Examples/Resources/SqlServerConfiguration/2-ConfigureInstanceToEnablePriorityBoost.ps1 similarity index 91% rename from Examples/Resources/xSQLServerConfiguration/2-ConfigureInstanceToEnablePriorityBoost.ps1 rename to Examples/Resources/SqlServerConfiguration/2-ConfigureInstanceToEnablePriorityBoost.ps1 index 93c1b222c..b267350d6 100644 --- a/Examples/Resources/xSQLServerConfiguration/2-ConfigureInstanceToEnablePriorityBoost.ps1 +++ b/Examples/Resources/SqlServerConfiguration/2-ConfigureInstanceToEnablePriorityBoost.ps1 @@ -11,7 +11,7 @@ Configuration Example node localhost { - xSQLServerConfiguration 'SQLConfigPriorityBoost' + SqlServerConfiguration 'SQLConfigPriorityBoost' { SQLServer = 'localhost' diff --git a/Examples/Resources/xSQLServerEndpoint/1-CreateEndpointWithDefaultValues.ps1 b/Examples/Resources/SqlServerEndpoint/1-CreateEndpointWithDefaultValues.ps1 similarity index 80% rename from Examples/Resources/xSQLServerEndpoint/1-CreateEndpointWithDefaultValues.ps1 rename to Examples/Resources/SqlServerEndpoint/1-CreateEndpointWithDefaultValues.ps1 index 3bbb8bf7d..ca3a5ad25 100644 --- a/Examples/Resources/xSQLServerEndpoint/1-CreateEndpointWithDefaultValues.ps1 +++ b/Examples/Resources/SqlServerEndpoint/1-CreateEndpointWithDefaultValues.ps1 @@ -13,11 +13,11 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC node localhost { - xSQLServerEndpoint SQLConfigureEndpoint-Instance1 + SqlServerEndpoint SQLConfigureEndpoint-Instance1 { EndpointName = 'HADR' SQLInstanceName = 'INST1' @@ -25,7 +25,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerEndpoint SQLConfigureEndpoint-Instances2 + SqlServerEndpoint SQLConfigureEndpoint-Instances2 { EndpointName = 'HADR' SQLInstanceName = 'INST2' diff --git a/Examples/Resources/xSQLServerEndpoint/2-CreateEndpointWithSpecificPortAndIPAddress.ps1 b/Examples/Resources/SqlServerEndpoint/2-CreateEndpointWithSpecificPortAndIPAddress.ps1 similarity index 88% rename from Examples/Resources/xSQLServerEndpoint/2-CreateEndpointWithSpecificPortAndIPAddress.ps1 rename to Examples/Resources/SqlServerEndpoint/2-CreateEndpointWithSpecificPortAndIPAddress.ps1 index f807d42be..bbc5d5c6f 100644 --- a/Examples/Resources/xSQLServerEndpoint/2-CreateEndpointWithSpecificPortAndIPAddress.ps1 +++ b/Examples/Resources/SqlServerEndpoint/2-CreateEndpointWithSpecificPortAndIPAddress.ps1 @@ -12,11 +12,11 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC node localhost { - xSQLServerEndpoint SQLConfigureEndpoint + SqlServerEndpoint SQLConfigureEndpoint { Ensure = 'Present' diff --git a/Examples/Resources/xSQLServerEndpoint/3-RemoveEndpoint.ps1 b/Examples/Resources/SqlServerEndpoint/3-RemoveEndpoint.ps1 similarity index 82% rename from Examples/Resources/xSQLServerEndpoint/3-RemoveEndpoint.ps1 rename to Examples/Resources/SqlServerEndpoint/3-RemoveEndpoint.ps1 index deecb023c..088e2905f 100644 --- a/Examples/Resources/xSQLServerEndpoint/3-RemoveEndpoint.ps1 +++ b/Examples/Resources/SqlServerEndpoint/3-RemoveEndpoint.ps1 @@ -13,11 +13,11 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC node localhost { - xSQLServerEndpoint SQLConfigureEndpoint-Instance1 + SqlServerEndpoint SQLConfigureEndpoint-Instance1 { Ensure = 'Absent' @@ -27,7 +27,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerEndpoint SQLConfigureEndpoint-Instance2 + SqlServerEndpoint SQLConfigureEndpoint-Instance2 { Ensure = 'Absent' diff --git a/Examples/Resources/xSQLServerEndpointPermission/1-AddConnectPermission.ps1 b/Examples/Resources/SqlServerEndpointPermission/1-AddConnectPermission.ps1 similarity index 89% rename from Examples/Resources/xSQLServerEndpointPermission/1-AddConnectPermission.ps1 rename to Examples/Resources/SqlServerEndpointPermission/1-AddConnectPermission.ps1 index fea85e1fb..b7a3efa51 100644 --- a/Examples/Resources/xSQLServerEndpointPermission/1-AddConnectPermission.ps1 +++ b/Examples/Resources/SqlServerEndpointPermission/1-AddConnectPermission.ps1 @@ -18,11 +18,11 @@ Configuration Example $SqlServiceCredential ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC node localhost { - xSQLServerEndpointPermission SQLConfigureEndpointPermission + SqlServerEndpointPermission SQLConfigureEndpointPermission { Ensure = 'Present' NodeName = $Node.NodeName diff --git a/Examples/Resources/xSQLServerEndpointPermission/2-RemoveConnectPermission.ps1 b/Examples/Resources/SqlServerEndpointPermission/2-RemoveConnectPermission.ps1 similarity index 89% rename from Examples/Resources/xSQLServerEndpointPermission/2-RemoveConnectPermission.ps1 rename to Examples/Resources/SqlServerEndpointPermission/2-RemoveConnectPermission.ps1 index 47a1192c6..7d27b2052 100644 --- a/Examples/Resources/xSQLServerEndpointPermission/2-RemoveConnectPermission.ps1 +++ b/Examples/Resources/SqlServerEndpointPermission/2-RemoveConnectPermission.ps1 @@ -18,11 +18,11 @@ Configuration Example $SqlServiceCredential ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC node localhost { - xSQLServerEndpointPermission SQLConfigureEndpointPermission + SqlServerEndpointPermission SQLConfigureEndpointPermission { Ensure = 'Absent' NodeName = $Node.NodeName diff --git a/Examples/Resources/xSQLServerEndpointPermission/3-AddConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 b/Examples/Resources/SqlServerEndpointPermission/3-AddConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 similarity index 89% rename from Examples/Resources/xSQLServerEndpointPermission/3-AddConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 rename to Examples/Resources/SqlServerEndpointPermission/3-AddConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 index 1c750eb61..5f7885a21 100644 --- a/Examples/Resources/xSQLServerEndpointPermission/3-AddConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 +++ b/Examples/Resources/SqlServerEndpointPermission/3-AddConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 @@ -43,11 +43,11 @@ Configuration Example $SqlServiceNode2Credential ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC node $AllNodes.Where{$_.Role -eq 'PrimaryReplica' }.NodeName { - xSQLServerEndpointPermission SQLConfigureEndpointPermissionPrimary + SqlServerEndpointPermission SQLConfigureEndpointPermissionPrimary { Ensure = 'Present' NodeName = $Node.NodeName @@ -59,7 +59,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerEndpointPermission SQLConfigureEndpointPermissionSecondary + SqlServerEndpointPermission SQLConfigureEndpointPermissionSecondary { Ensure = 'Present' NodeName = $Node.NodeName @@ -74,7 +74,7 @@ Configuration Example Node $AllNodes.Where{ $_.Role -eq 'SecondaryReplica' }.NodeName { - xSQLServerEndpointPermission SQLConfigureEndpointPermissionPrimary + SqlServerEndpointPermission SQLConfigureEndpointPermissionPrimary { Ensure = 'Present' NodeName = $Node.NodeName @@ -86,7 +86,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerEndpointPermission SQLConfigureEndpointPermissionSecondary + SqlServerEndpointPermission SQLConfigureEndpointPermissionSecondary { Ensure = 'Present' NodeName = $Node.NodeName diff --git a/Examples/Resources/xSQLServerEndpointPermission/4-RemoveConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 b/Examples/Resources/SqlServerEndpointPermission/4-RemoveConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 similarity index 78% rename from Examples/Resources/xSQLServerEndpointPermission/4-RemoveConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 rename to Examples/Resources/SqlServerEndpointPermission/4-RemoveConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 index 2af15d227..9aff5df62 100644 --- a/Examples/Resources/xSQLServerEndpointPermission/4-RemoveConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 +++ b/Examples/Resources/SqlServerEndpointPermission/4-RemoveConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1 @@ -43,11 +43,11 @@ Configuration Example $SqlServiceNode2Credential ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC node $AllNodes.Where{$_.Role -eq 'PrimaryReplica' }.NodeName { - xSQLServerEndpointPermission RemoveSQLConfigureEndpointPermissionPrimary + SqlServerEndpointPermission RemoveSQLConfigureEndpointPermissionPrimary { Ensure = 'Absent' NodeName = $Node.NodeName @@ -58,10 +58,10 @@ Configuration Example PsDscRunAsCredential = $SqlAdministratorCredential - DependsOn = '[xSQLServerEndpointPermission]SQLConfigureEndpointPermissionPrimary' + DependsOn = '[SqlServerEndpointPermission]SQLConfigureEndpointPermissionPrimary' } - xSQLServerEndpointPermission RemoveSQLConfigureEndpointPermissionSecondary + SqlServerEndpointPermission RemoveSQLConfigureEndpointPermissionSecondary { Ensure = 'Absent' NodeName = $Node.NodeName @@ -72,13 +72,13 @@ Configuration Example PsDscRunAsCredential = $SqlAdministratorCredential - DependsOn = '[xSQLServerEndpointPermission]SQLConfigureEndpointPermissionSecondary' + DependsOn = '[SqlServerEndpointPermission]SQLConfigureEndpointPermissionSecondary' } } Node $AllNodes.Where{ $_.Role -eq 'SecondaryReplica' }.NodeName { - xSQLServerEndpointPermission RemoveSQLConfigureEndpointPermissionPrimary + SqlServerEndpointPermission RemoveSQLConfigureEndpointPermissionPrimary { Ensure = 'Absent' NodeName = $Node.NodeName @@ -89,10 +89,10 @@ Configuration Example PsDscRunAsCredential = $SqlAdministratorCredential - DependsOn = '[xSQLServerEndpointPermission]SQLConfigureEndpointPermissionPrimary' + DependsOn = '[SqlServerEndpointPermission]SQLConfigureEndpointPermissionPrimary' } - xSQLServerEndpointPermission RemoveSQLConfigureEndpointPermissionSecondary + SqlServerEndpointPermission RemoveSQLConfigureEndpointPermissionSecondary { Ensure = 'Absent' NodeName = $Node.NodeName @@ -103,7 +103,7 @@ Configuration Example PsDscRunAsCredential = $SqlAdministratorCredential - DependsOn = '[xSQLServerEndpointPermission]SQLConfigureEndpointPermissionSecondary' + DependsOn = '[SqlServerEndpointPermission]SQLConfigureEndpointPermissionSecondary' } } } diff --git a/Examples/Resources/xSQLServerEndpointState/1-MakeSureEndpointIsStarted.ps1 b/Examples/Resources/SqlServerEndpointState/1-MakeSureEndpointIsStarted.ps1 similarity index 91% rename from Examples/Resources/xSQLServerEndpointState/1-MakeSureEndpointIsStarted.ps1 rename to Examples/Resources/SqlServerEndpointState/1-MakeSureEndpointIsStarted.ps1 index 11baa12e2..65f7e08a7 100644 --- a/Examples/Resources/xSQLServerEndpointState/1-MakeSureEndpointIsStarted.ps1 +++ b/Examples/Resources/SqlServerEndpointState/1-MakeSureEndpointIsStarted.ps1 @@ -21,12 +21,12 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC node localhost { # Start the DefaultMirrorEndpoint in the default instance - xSQLServerEndpointState StartEndpoint1 + SqlServerEndpointState StartEndpoint1 { NodeName = 'SQLNODE01.company.local' InstanceName = 'MSSQLSERVER' @@ -37,7 +37,7 @@ Configuration Example } # Start the HADR in the default instance - xSQLServerEndpointState StartEndpoint2 + SqlServerEndpointState StartEndpoint2 { NodeName = 'SQLNODE01.company.local' InstanceName = 'MSSQLSERVER' @@ -48,7 +48,7 @@ Configuration Example } # Start the DefaultMirrorEndpoint in the named instance INSTANCE1 - xSQLServerEndpointState StartEndpoint3 + SqlServerEndpointState StartEndpoint3 { NodeName = 'SQLNODE01.company.local' InstanceName = 'INSTANCE1' diff --git a/Examples/Resources/xSQLServerEndpointState/2-MakeSureEndpointIsStopped.ps1 b/Examples/Resources/SqlServerEndpointState/2-MakeSureEndpointIsStopped.ps1 similarity index 88% rename from Examples/Resources/xSQLServerEndpointState/2-MakeSureEndpointIsStopped.ps1 rename to Examples/Resources/SqlServerEndpointState/2-MakeSureEndpointIsStopped.ps1 index 69422e93b..c53398403 100644 --- a/Examples/Resources/xSQLServerEndpointState/2-MakeSureEndpointIsStopped.ps1 +++ b/Examples/Resources/SqlServerEndpointState/2-MakeSureEndpointIsStopped.ps1 @@ -12,11 +12,11 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC node localhost { - xSQLServerEndpointState StopEndpoint + SqlServerEndpointState StopEndpoint { NodeName = 'SQLNODE01.company.local' InstanceName = 'MSSQLSERVER' diff --git a/Examples/Resources/xSQLServerLogin/1-AddLogin.ps1 b/Examples/Resources/SqlServerLogin/1-AddLogin.ps1 similarity index 92% rename from Examples/Resources/xSQLServerLogin/1-AddLogin.ps1 rename to Examples/Resources/SqlServerLogin/1-AddLogin.ps1 index 063a495a1..d8ed1f97c 100644 --- a/Examples/Resources/xSQLServerLogin/1-AddLogin.ps1 +++ b/Examples/Resources/SqlServerLogin/1-AddLogin.ps1 @@ -24,7 +24,7 @@ Configuration Example Import-DscResource -ModuleName xSqlServer node localhost { - xSQLServerLogin Add_WindowsUser + SqlServerLogin Add_WindowsUser { Ensure = 'Present' Name = 'CONTOSO\WindowsUser' @@ -34,7 +34,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerLogin Add_DisabledWindowsUser + SqlServerLogin Add_DisabledWindowsUser { Ensure = 'Present' Name = 'CONTOSO\WindowsUser2' @@ -45,7 +45,7 @@ Configuration Example Disabled = $true } - xSQLServerLogin Add_WindowsGroup + SqlServerLogin Add_WindowsGroup { Ensure = 'Present' Name = 'CONTOSO\WindowsGroup' @@ -55,7 +55,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerLogin Add_SqlLogin + SqlServerLogin Add_SqlLogin { Ensure = 'Present' Name = 'SqlLogin' diff --git a/Examples/Resources/xSQLServerLogin/2-RemoveLogin.ps1 b/Examples/Resources/SqlServerLogin/2-RemoveLogin.ps1 similarity index 89% rename from Examples/Resources/xSQLServerLogin/2-RemoveLogin.ps1 rename to Examples/Resources/SqlServerLogin/2-RemoveLogin.ps1 index 98a50222d..4073db818 100644 --- a/Examples/Resources/xSQLServerLogin/2-RemoveLogin.ps1 +++ b/Examples/Resources/SqlServerLogin/2-RemoveLogin.ps1 @@ -14,7 +14,7 @@ Configuration Example Import-DscResource -ModuleName xSqlServer node localhost { - xSQLServerLogin Remove_WindowsUser + SqlServerLogin Remove_WindowsUser { Ensure = 'Absent' Name = 'CONTOSO\WindowsUser' @@ -23,7 +23,7 @@ Configuration Example SQLInstanceName = 'DSC' } - xSQLServerLogin Remove_WindowsGroup + SqlServerLogin Remove_WindowsGroup { Ensure = 'Absent' Name = 'CONTOSO\WindowsGroup' @@ -32,7 +32,7 @@ Configuration Example SQLInstanceName = 'DSC' } - xSQLServerLogin Remove_SqlLogin + SqlServerLogin Remove_SqlLogin { Ensure = 'Absent' Name = 'SqlLogin' diff --git a/Examples/Resources/xSQLServerMaxDop/1-SetMaxDopToOne.ps1 b/Examples/Resources/SqlServerMaxDop/1-SetMaxDopToOne.ps1 similarity index 93% rename from Examples/Resources/xSQLServerMaxDop/1-SetMaxDopToOne.ps1 rename to Examples/Resources/SqlServerMaxDop/1-SetMaxDopToOne.ps1 index 53638884e..d772fec5d 100644 --- a/Examples/Resources/xSQLServerMaxDop/1-SetMaxDopToOne.ps1 +++ b/Examples/Resources/SqlServerMaxDop/1-SetMaxDopToOne.ps1 @@ -17,7 +17,7 @@ Configuration Example node localhost { - xSQLServerMaxDop Set_SQLServerMaxDop_ToOne + SqlServerMaxDop Set_SQLServerMaxDop_ToOne { Ensure = 'Present' DynamicAlloc = $false diff --git a/Examples/Resources/xSQLServerMaxDop/2-SetMaxDopToAuto.ps1 b/Examples/Resources/SqlServerMaxDop/2-SetMaxDopToAuto.ps1 similarity index 95% rename from Examples/Resources/xSQLServerMaxDop/2-SetMaxDopToAuto.ps1 rename to Examples/Resources/SqlServerMaxDop/2-SetMaxDopToAuto.ps1 index 4cfd75451..4f1feddc2 100644 --- a/Examples/Resources/xSQLServerMaxDop/2-SetMaxDopToAuto.ps1 +++ b/Examples/Resources/SqlServerMaxDop/2-SetMaxDopToAuto.ps1 @@ -22,7 +22,7 @@ Configuration Example node localhost { - xSQLServerMaxDop Set_SQLServerMaxDop_ToAuto + SqlServerMaxDop Set_SQLServerMaxDop_ToAuto { Ensure = 'Present' DynamicAlloc = $true diff --git a/Examples/Resources/xSQLServerMaxDop/3-SetMaxDopToDefault.ps1 b/Examples/Resources/SqlServerMaxDop/3-SetMaxDopToDefault.ps1 similarity index 92% rename from Examples/Resources/xSQLServerMaxDop/3-SetMaxDopToDefault.ps1 rename to Examples/Resources/SqlServerMaxDop/3-SetMaxDopToDefault.ps1 index 917ada584..da1ce35fa 100644 --- a/Examples/Resources/xSQLServerMaxDop/3-SetMaxDopToDefault.ps1 +++ b/Examples/Resources/SqlServerMaxDop/3-SetMaxDopToDefault.ps1 @@ -17,7 +17,7 @@ Configuration Example node localhost { - xSQLServerMaxDop Set_SQLServerMaxDop_ToDefault + SqlServerMaxDop Set_SQLServerMaxDop_ToDefault { Ensure = 'Absent' SQLServer = 'SQLServer' diff --git a/Examples/Resources/xSQLServerMemory/1-SetMaxMemoryTo12GB.ps1 b/Examples/Resources/SqlServerMemory/1-SetMaxMemoryTo12GB.ps1 similarity index 93% rename from Examples/Resources/xSQLServerMemory/1-SetMaxMemoryTo12GB.ps1 rename to Examples/Resources/SqlServerMemory/1-SetMaxMemoryTo12GB.ps1 index fc8a2a789..07413d429 100644 --- a/Examples/Resources/xSQLServerMemory/1-SetMaxMemoryTo12GB.ps1 +++ b/Examples/Resources/SqlServerMemory/1-SetMaxMemoryTo12GB.ps1 @@ -17,7 +17,7 @@ Configuration Example node localhost { - xSQLServerMemory Set_SQLServerMaxMemory_To12GB + SqlServerMemory Set_SQLServerMaxMemory_To12GB { Ensure = 'Present' DynamicAlloc = $false diff --git a/Examples/Resources/xSQLServerMemory/2-SetMaxMemoryToAuto.ps1 b/Examples/Resources/SqlServerMemory/2-SetMaxMemoryToAuto.ps1 similarity index 94% rename from Examples/Resources/xSQLServerMemory/2-SetMaxMemoryToAuto.ps1 rename to Examples/Resources/SqlServerMemory/2-SetMaxMemoryToAuto.ps1 index a13999410..8d6369f08 100644 --- a/Examples/Resources/xSQLServerMemory/2-SetMaxMemoryToAuto.ps1 +++ b/Examples/Resources/SqlServerMemory/2-SetMaxMemoryToAuto.ps1 @@ -22,7 +22,7 @@ Configuration Example node localhost { - xSQLServerMemory Set_SQLServerMaxMemory_ToAuto + SqlServerMemory Set_SQLServerMaxMemory_ToAuto { Ensure = 'Present' DynamicAlloc = $true diff --git a/Examples/Resources/xSQLServerMemory/3-SetMinMemoryToFixedValueAndMaxMemoryToAuto.ps1 b/Examples/Resources/SqlServerMemory/3-SetMinMemoryToFixedValueAndMaxMemoryToAuto.ps1 similarity index 92% rename from Examples/Resources/xSQLServerMemory/3-SetMinMemoryToFixedValueAndMaxMemoryToAuto.ps1 rename to Examples/Resources/SqlServerMemory/3-SetMinMemoryToFixedValueAndMaxMemoryToAuto.ps1 index 7c245ec29..9ba0ceda5 100644 --- a/Examples/Resources/xSQLServerMemory/3-SetMinMemoryToFixedValueAndMaxMemoryToAuto.ps1 +++ b/Examples/Resources/SqlServerMemory/3-SetMinMemoryToFixedValueAndMaxMemoryToAuto.ps1 @@ -17,7 +17,7 @@ Configuration Example node localhost { - xSQLServerMemory Set_SQLServerMinAndMaxMemory_ToAuto + SqlServerMemory Set_SQLServerMinAndMaxMemory_ToAuto { Ensure = 'Present' DynamicAlloc = $true diff --git a/Examples/Resources/xSQLServerMemory/4-SetMaxMemoryToDefault.ps1 b/Examples/Resources/SqlServerMemory/4-SetMaxMemoryToDefault.ps1 similarity index 91% rename from Examples/Resources/xSQLServerMemory/4-SetMaxMemoryToDefault.ps1 rename to Examples/Resources/SqlServerMemory/4-SetMaxMemoryToDefault.ps1 index 975249117..239b7c9f6 100644 --- a/Examples/Resources/xSQLServerMemory/4-SetMaxMemoryToDefault.ps1 +++ b/Examples/Resources/SqlServerMemory/4-SetMaxMemoryToDefault.ps1 @@ -17,7 +17,7 @@ Configuration Example node localhost { - xSQLServerMemory Set_SQLServerMaxMemory_ToDefault + SqlServerMemory Set_SQLServerMaxMemory_ToDefault { Ensure = 'Absent' SQLServer = 'SQLServer' diff --git a/Examples/Resources/xSQLServerNetwork/1-EnableTcpIpWithStaticPort.ps1 b/Examples/Resources/SqlServerNetwork/1-EnableTcpIpWithStaticPort.ps1 similarity index 92% rename from Examples/Resources/xSQLServerNetwork/1-EnableTcpIpWithStaticPort.ps1 rename to Examples/Resources/SqlServerNetwork/1-EnableTcpIpWithStaticPort.ps1 index 20062dd69..64fb3bb9c 100644 --- a/Examples/Resources/xSQLServerNetwork/1-EnableTcpIpWithStaticPort.ps1 +++ b/Examples/Resources/SqlServerNetwork/1-EnableTcpIpWithStaticPort.ps1 @@ -17,7 +17,7 @@ Configuration Example node localhost { - xSQLServerNetwork 'ChangeTcpIpOnDefaultInstance' + SqlServerNetwork 'ChangeTcpIpOnDefaultInstance' { InstanceName = 'MSSQLSERVER' ProtocolName = 'Tcp' diff --git a/Examples/Resources/xSQLServerNetwork/2-EnableTcpIpWithDynamicPort.ps1 b/Examples/Resources/SqlServerNetwork/2-EnableTcpIpWithDynamicPort.ps1 similarity index 92% rename from Examples/Resources/xSQLServerNetwork/2-EnableTcpIpWithDynamicPort.ps1 rename to Examples/Resources/SqlServerNetwork/2-EnableTcpIpWithDynamicPort.ps1 index 1ba825cf5..0fa865d1b 100644 --- a/Examples/Resources/xSQLServerNetwork/2-EnableTcpIpWithDynamicPort.ps1 +++ b/Examples/Resources/SqlServerNetwork/2-EnableTcpIpWithDynamicPort.ps1 @@ -17,7 +17,7 @@ Configuration Example node localhost { - xSQLServerNetwork 'ChangeTcpIpOnDefaultInstance' + SqlServerNetwork 'ChangeTcpIpOnDefaultInstance' { InstanceName = 'MSSQLSERVER' ProtocolName = 'Tcp' diff --git a/Examples/Resources/xSQLServerPermission/1-AddServerPermissionForLogin.ps1 b/Examples/Resources/SqlServerPermission/1-AddServerPermissionForLogin.ps1 similarity index 87% rename from Examples/Resources/xSQLServerPermission/1-AddServerPermissionForLogin.ps1 rename to Examples/Resources/SqlServerPermission/1-AddServerPermissionForLogin.ps1 index 92ceac630..10fee8649 100644 --- a/Examples/Resources/xSQLServerPermission/1-AddServerPermissionForLogin.ps1 +++ b/Examples/Resources/SqlServerPermission/1-AddServerPermissionForLogin.ps1 @@ -13,12 +13,12 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC node localhost { # Add permission - xSQLServerPermission 'SQLConfigureServerPermission-SYSTEM' + SqlServerPermission 'SQLConfigureServerPermission-SYSTEM' { Ensure = 'Present' NodeName = 'SQLNODE01.company.local' @@ -29,7 +29,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerPermission 'SQLConfigureServerPermission-ClusSvc' + SqlServerPermission 'SQLConfigureServerPermission-ClusSvc' { Ensure = 'Present' NodeName = 'SQLNODE01.company.local' diff --git a/Examples/Resources/xSQLServerPermission/2-RemoveServerPermissionForLogin.ps1 b/Examples/Resources/SqlServerPermission/2-RemoveServerPermissionForLogin.ps1 similarity index 88% rename from Examples/Resources/xSQLServerPermission/2-RemoveServerPermissionForLogin.ps1 rename to Examples/Resources/SqlServerPermission/2-RemoveServerPermissionForLogin.ps1 index 8355c62b6..e53b20b9c 100644 --- a/Examples/Resources/xSQLServerPermission/2-RemoveServerPermissionForLogin.ps1 +++ b/Examples/Resources/SqlServerPermission/2-RemoveServerPermissionForLogin.ps1 @@ -13,12 +13,12 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC node localhost { # Add permission - xSQLServerPermission SQLConfigureServerPermission + SqlServerPermission SQLConfigureServerPermission { Ensure = 'Absent' NodeName = 'SQLNODE01.company.local' diff --git a/Examples/Resources/xSQLServerReplication/1-ConfigureInstanceAsDistributor.ps1 b/Examples/Resources/SqlServerReplication/1-ConfigureInstanceAsDistributor.ps1 similarity index 94% rename from Examples/Resources/xSQLServerReplication/1-ConfigureInstanceAsDistributor.ps1 rename to Examples/Resources/SqlServerReplication/1-ConfigureInstanceAsDistributor.ps1 index c1d5bf716..87b93c75f 100644 --- a/Examples/Resources/xSQLServerReplication/1-ConfigureInstanceAsDistributor.ps1 +++ b/Examples/Resources/SqlServerReplication/1-ConfigureInstanceAsDistributor.ps1 @@ -16,7 +16,7 @@ Configuration Example node localhost { - xSQLServerReplication distributor + SqlServerReplication distributor { Ensure = 'Present' InstanceName = 'MSSQLSERVER' diff --git a/Examples/Resources/xSQLServerReplication/2-ConfigureInstanceAsPublisher.ps1 b/Examples/Resources/SqlServerReplication/2-ConfigureInstanceAsPublisher.ps1 similarity index 94% rename from Examples/Resources/xSQLServerReplication/2-ConfigureInstanceAsPublisher.ps1 rename to Examples/Resources/SqlServerReplication/2-ConfigureInstanceAsPublisher.ps1 index 3d29ae26b..97efac64b 100644 --- a/Examples/Resources/xSQLServerReplication/2-ConfigureInstanceAsPublisher.ps1 +++ b/Examples/Resources/SqlServerReplication/2-ConfigureInstanceAsPublisher.ps1 @@ -16,7 +16,7 @@ Configuration Example node localhost { - xSQLServerReplication publisher + SqlServerReplication publisher { Ensure = 'Present' InstanceName = 'PUBLISHER' diff --git a/Examples/Resources/xSQLServerRole/1-AddServerRole.ps1 b/Examples/Resources/SqlServerRole/1-AddServerRole.ps1 similarity index 91% rename from Examples/Resources/xSQLServerRole/1-AddServerRole.ps1 rename to Examples/Resources/SqlServerRole/1-AddServerRole.ps1 index c14a0cb10..9cba88c1b 100644 --- a/Examples/Resources/xSQLServerRole/1-AddServerRole.ps1 +++ b/Examples/Resources/SqlServerRole/1-AddServerRole.ps1 @@ -15,7 +15,7 @@ Configuration Example Import-DscResource -ModuleName xSqlServer node localhost { - xSQLServerRole Add_ServerRole_AdminSqlforBI + SqlServerRole Add_ServerRole_AdminSqlforBI { Ensure = 'Present' ServerRoleName = "AdminSqlforBI" diff --git a/Examples/Resources/xSQLServerRole/2-RemoveServerRole.ps1 b/Examples/Resources/SqlServerRole/2-RemoveServerRole.ps1 similarity index 93% rename from Examples/Resources/xSQLServerRole/2-RemoveServerRole.ps1 rename to Examples/Resources/SqlServerRole/2-RemoveServerRole.ps1 index 3abaf2e12..359b6e928 100644 --- a/Examples/Resources/xSQLServerRole/2-RemoveServerRole.ps1 +++ b/Examples/Resources/SqlServerRole/2-RemoveServerRole.ps1 @@ -15,7 +15,7 @@ Configuration Example Import-DscResource -ModuleName xSqlServer node localhost { - xSQLServerRole Remove_ServerRole + SqlServerRole Remove_ServerRole { Ensure = 'Absent' ServerRoleName = "serverRoleToDelete" diff --git a/Examples/Resources/xSQLServerRole/3-AddMembersToServerRole.ps1 b/Examples/Resources/SqlServerRole/3-AddMembersToServerRole.ps1 similarity index 93% rename from Examples/Resources/xSQLServerRole/3-AddMembersToServerRole.ps1 rename to Examples/Resources/SqlServerRole/3-AddMembersToServerRole.ps1 index 4fd419159..39d654e33 100644 --- a/Examples/Resources/xSQLServerRole/3-AddMembersToServerRole.ps1 +++ b/Examples/Resources/SqlServerRole/3-AddMembersToServerRole.ps1 @@ -16,7 +16,7 @@ Configuration Example Import-DscResource -ModuleName xSqlServer node localhost { - xSQLServerRole Add_ServerRole_AdminSqlforBI + SqlServerRole Add_ServerRole_AdminSqlforBI { Ensure = 'Present' ServerRoleName = 'AdminSqlforBI' diff --git a/Examples/Resources/xSQLServerRole/4-MembersToIncludeInServerRole.ps1 b/Examples/Resources/SqlServerRole/4-MembersToIncludeInServerRole.ps1 similarity index 93% rename from Examples/Resources/xSQLServerRole/4-MembersToIncludeInServerRole.ps1 rename to Examples/Resources/SqlServerRole/4-MembersToIncludeInServerRole.ps1 index 444a60071..827abea9a 100644 --- a/Examples/Resources/xSQLServerRole/4-MembersToIncludeInServerRole.ps1 +++ b/Examples/Resources/SqlServerRole/4-MembersToIncludeInServerRole.ps1 @@ -16,7 +16,7 @@ Configuration Example Import-DscResource -ModuleName xSqlServer node localhost { - xSQLServerRole Add_ServerRole_AdminSqlforBI + SqlServerRole Add_ServerRole_AdminSqlforBI { Ensure = 'Present' ServerRoleName = 'AdminSqlforBI' diff --git a/Examples/Resources/xSQLServerRole/5-MembersToExcludeInServerRole.ps1 b/Examples/Resources/SqlServerRole/5-MembersToExcludeInServerRole.ps1 similarity index 93% rename from Examples/Resources/xSQLServerRole/5-MembersToExcludeInServerRole.ps1 rename to Examples/Resources/SqlServerRole/5-MembersToExcludeInServerRole.ps1 index 5a2f520d0..0bd9fbe63 100644 --- a/Examples/Resources/xSQLServerRole/5-MembersToExcludeInServerRole.ps1 +++ b/Examples/Resources/SqlServerRole/5-MembersToExcludeInServerRole.ps1 @@ -16,7 +16,7 @@ Configuration Example Import-DscResource -ModuleName xSqlServer node localhost { - xSQLServerRole Drop_ServerRole_AdminSqlforBI + SqlServerRole Drop_ServerRole_AdminSqlforBI { Ensure = 'Present' ServerRoleName = 'AdminSqlforBI' diff --git a/Examples/Resources/xSQLServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 b/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 similarity index 90% rename from Examples/Resources/xSQLServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 rename to Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 index 42b91b13c..6c0e81369 100644 --- a/Examples/Resources/xSQLServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 +++ b/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1 @@ -15,7 +15,7 @@ Configuration Example Import-DscResource -ModuleName xSqlServer Node localhost { - xSQLServerServiceAccount SetServiceAcccount_User + SqlServerServiceAccount SetServiceAcccount_User { SQLServer = 'TestServer' SQLInstanceName = 'MSSQLSERVER' diff --git a/Examples/Resources/xSQLServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 b/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 similarity index 93% rename from Examples/Resources/xSQLServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 rename to Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 index d0ff7a4c3..4a9918c2d 100644 --- a/Examples/Resources/xSQLServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 +++ b/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1 @@ -18,7 +18,7 @@ Configuration Example Import-DscResource -ModuleName xSqlServer Node localhost { - xSQLServerServiceAccount SetServiceAcccount_User + SqlServerServiceAccount SetServiceAcccount_User { SQLServer = 'TestServer' SQLInstanceName = 'DSC' diff --git a/Examples/Resources/xSQLServerSetup/1-InstallDefaultInstanceSingleServer.ps1 b/Examples/Resources/SqlSetup/1-InstallDefaultInstanceSingleServer.ps1 similarity index 97% rename from Examples/Resources/xSQLServerSetup/1-InstallDefaultInstanceSingleServer.ps1 rename to Examples/Resources/SqlSetup/1-InstallDefaultInstanceSingleServer.ps1 index 8988308c3..7154381a9 100644 --- a/Examples/Resources/xSQLServerSetup/1-InstallDefaultInstanceSingleServer.ps1 +++ b/Examples/Resources/SqlSetup/1-InstallDefaultInstanceSingleServer.ps1 @@ -35,7 +35,7 @@ Configuration Example $SqlAgentServiceCredential = $SqlServiceCredential ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC node localhost { @@ -55,7 +55,7 @@ Configuration Example #endregion Install prerequisites for SQL Server #region Install SQL Server - xSQLServerSetup 'InstallDefaultInstance' + SqlSetup 'InstallDefaultInstance' { InstanceName = 'MSSQLSERVER' Features = 'SQLENGINE,AS' diff --git a/Examples/Resources/xSQLServerSetup/2-InstallNamedInstanceSingleServer.ps1 b/Examples/Resources/SqlSetup/2-InstallNamedInstanceSingleServer.ps1 similarity index 97% rename from Examples/Resources/xSQLServerSetup/2-InstallNamedInstanceSingleServer.ps1 rename to Examples/Resources/SqlSetup/2-InstallNamedInstanceSingleServer.ps1 index 254763e86..a754fffe6 100644 --- a/Examples/Resources/xSQLServerSetup/2-InstallNamedInstanceSingleServer.ps1 +++ b/Examples/Resources/SqlSetup/2-InstallNamedInstanceSingleServer.ps1 @@ -35,7 +35,7 @@ Configuration Example $SqlAgentServiceCredential = $SqlServiceCredential ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC node localhost { @@ -55,7 +55,7 @@ Configuration Example #endregion Install prerequisites for SQL Server #region Install SQL Server - xSQLServerSetup 'InstallNamedInstance-INST2016' + SqlSetup 'InstallNamedInstance-INST2016' { InstanceName = 'INST2016' Features = 'SQLENGINE,AS' diff --git a/Examples/Resources/xSQLServerSetup/3-InstallNamedInstanceSingleServerFromUncPathUsingSourceCredential.ps1 b/Examples/Resources/SqlSetup/3-InstallNamedInstanceSingleServerFromUncPathUsingSourceCredential.ps1 similarity index 97% rename from Examples/Resources/xSQLServerSetup/3-InstallNamedInstanceSingleServerFromUncPathUsingSourceCredential.ps1 rename to Examples/Resources/SqlSetup/3-InstallNamedInstanceSingleServerFromUncPathUsingSourceCredential.ps1 index 3b01a2588..2ee22fadd 100644 --- a/Examples/Resources/xSQLServerSetup/3-InstallNamedInstanceSingleServerFromUncPathUsingSourceCredential.ps1 +++ b/Examples/Resources/SqlSetup/3-InstallNamedInstanceSingleServerFromUncPathUsingSourceCredential.ps1 @@ -39,7 +39,7 @@ Configuration Example $SqlAgentServiceCredential = $SqlServiceCredential ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC node localhost { @@ -59,7 +59,7 @@ Configuration Example #endregion Install prerequisites for SQL Server #region Install SQL Server - xSQLServerSetup 'InstallNamedInstance-INST2016' + SqlSetup 'InstallNamedInstance-INST2016' { InstanceName = 'INST2016' Features = 'SQLENGINE,AS' diff --git a/Examples/Resources/xSQLServerSetup/4-InstallNamedInstanceInFailoverClusterFirstNode.ps1 b/Examples/Resources/SqlSetup/4-InstallNamedInstanceInFailoverClusterFirstNode.ps1 similarity index 98% rename from Examples/Resources/xSQLServerSetup/4-InstallNamedInstanceInFailoverClusterFirstNode.ps1 rename to Examples/Resources/SqlSetup/4-InstallNamedInstanceInFailoverClusterFirstNode.ps1 index 786bb5d53..3e2ddc3a2 100644 --- a/Examples/Resources/xSQLServerSetup/4-InstallNamedInstanceInFailoverClusterFirstNode.ps1 +++ b/Examples/Resources/SqlSetup/4-InstallNamedInstanceInFailoverClusterFirstNode.ps1 @@ -59,7 +59,7 @@ Configuration Example $SqlAgentServiceCredential = $SqlServiceCredential ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC node localhost { @@ -79,7 +79,7 @@ Configuration Example #endregion Install prerequisites for SQL Server #region Install SQL Server Failover Cluster - xSQLServerSetup 'InstallNamedInstanceNode1-INST2016' + SqlSetup 'InstallNamedInstanceNode1-INST2016' { Action = 'InstallFailoverCluster' ForceReboot = $false diff --git a/Examples/Resources/xSQLServerSetup/5-InstallNamedInstanceInFailoverClusterSecondNode.ps1 b/Examples/Resources/SqlSetup/5-InstallNamedInstanceInFailoverClusterSecondNode.ps1 similarity index 97% rename from Examples/Resources/xSQLServerSetup/5-InstallNamedInstanceInFailoverClusterSecondNode.ps1 rename to Examples/Resources/SqlSetup/5-InstallNamedInstanceInFailoverClusterSecondNode.ps1 index 17f9b250e..8961aaf9a 100644 --- a/Examples/Resources/xSQLServerSetup/5-InstallNamedInstanceInFailoverClusterSecondNode.ps1 +++ b/Examples/Resources/SqlSetup/5-InstallNamedInstanceInFailoverClusterSecondNode.ps1 @@ -55,7 +55,7 @@ Configuration Example $SqlAgentServiceCredential = $SqlServiceCredential ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC node localhost { @@ -75,7 +75,7 @@ Configuration Example #endregion Install prerequisites for SQL Server #region Install SQL Server Failover Cluster - xSQLServerSetup 'InstallNamedInstanceNode2-INST2016' + SqlSetup 'InstallNamedInstanceNode2-INST2016' { Action = 'AddNode' ForceReboot = $false diff --git a/Examples/Resources/xWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1 b/Examples/Resources/SqlWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1 similarity index 82% rename from Examples/Resources/xWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1 rename to Examples/Resources/SqlWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1 index 96c191d9c..0624fe90c 100644 --- a/Examples/Resources/xWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1 +++ b/Examples/Resources/SqlWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1 @@ -12,11 +12,11 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC node localhost { - xWaitForAvailabilityGroup SQLConfigureAG-WaitAGTest1 + SqlWaitForAvailabilityGroup SQLConfigureAG-WaitAGTest1 { Name = 'AGTest1' RetryIntervalSec = 20 diff --git a/Examples/Resources/xWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1 b/Examples/Resources/SqlWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1 similarity index 81% rename from Examples/Resources/xWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1 rename to Examples/Resources/SqlWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1 index 93773477f..739ead20f 100644 --- a/Examples/Resources/xWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1 +++ b/Examples/Resources/SqlWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1 @@ -12,11 +12,11 @@ Configuration Example $SysAdminAccount ) - Import-DscResource -ModuleName xSQLServer + Import-DscResource -ModuleName SqlServerDSC node localhost { - xWaitForAvailabilityGroup SQLConfigureAG-WaitAGTest1 + SqlWaitForAvailabilityGroup SQLConfigureAG-WaitAGTest1 { Name = 'AGTest1' RetryIntervalSec = 20 @@ -25,7 +25,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xWaitForAvailabilityGroup SQLConfigureAG-WaitAGTest2 + SqlWaitForAvailabilityGroup SQLConfigureAG-WaitAGTest2 { Name = 'AGTest2' RetryIntervalSec = 20 diff --git a/Examples/Resources/xSQLServerFirewall/1-CreateInboundFirewallRules.ps1 b/Examples/Resources/SqlWindowsFirewall/1-CreateInboundFirewallRules.ps1 similarity index 88% rename from Examples/Resources/xSQLServerFirewall/1-CreateInboundFirewallRules.ps1 rename to Examples/Resources/SqlWindowsFirewall/1-CreateInboundFirewallRules.ps1 index 8ce7ccfa5..3310e37e1 100644 --- a/Examples/Resources/xSQLServerFirewall/1-CreateInboundFirewallRules.ps1 +++ b/Examples/Resources/SqlWindowsFirewall/1-CreateInboundFirewallRules.ps1 @@ -16,7 +16,7 @@ Configuration Example node localhost { - xSQLServerFirewall Create_FirewallRules_For_SQL2012 + SqlWindowsFirewall Create_FirewallRules_For_SQL2012 { Ensure = 'Present' Features = 'SQLENGINE,AS,RS,IS' @@ -26,7 +26,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerFirewall Create_FirewallRules_For_SQL2016 + SqlWindowsFirewall Create_FirewallRules_For_SQL2016 { Ensure = 'Present' Features = 'SQLENGINE' diff --git a/Examples/Resources/xSQLServerFirewall/2-RemoveInboundFirewallRules.ps1 b/Examples/Resources/SqlWindowsFirewall/2-RemoveInboundFirewallRules.ps1 similarity index 88% rename from Examples/Resources/xSQLServerFirewall/2-RemoveInboundFirewallRules.ps1 rename to Examples/Resources/SqlWindowsFirewall/2-RemoveInboundFirewallRules.ps1 index 583befca6..c81f78e76 100644 --- a/Examples/Resources/xSQLServerFirewall/2-RemoveInboundFirewallRules.ps1 +++ b/Examples/Resources/SqlWindowsFirewall/2-RemoveInboundFirewallRules.ps1 @@ -16,7 +16,7 @@ Configuration Example node localhost { - xSQLServerFirewall Remove_FirewallRules_For_SQL2012 + SqlWindowsFirewall Remove_FirewallRules_For_SQL2012 { Ensure = 'Absent' Features = 'SQLENGINE,AS,RS,IS' @@ -26,7 +26,7 @@ Configuration Example PsDscRunAsCredential = $SysAdminAccount } - xSQLServerFirewall Remove_FirewallRules_For_SQL2016 + SqlWindowsFirewall Remove_FirewallRules_For_SQL2016 { Ensure = 'Absent' Features = 'SQLENGINE' diff --git a/Examples/SQL-ClusterDB.ps1 b/Examples/SQL-ClusterDB.ps1 index 8b31fc540..137afcefb 100644 --- a/Examples/SQL-ClusterDB.ps1 +++ b/Examples/SQL-ClusterDB.ps1 @@ -5,7 +5,7 @@ param () Configuration SQL { - Import-DscResource -Module xSQLServer + Import-DscResource -Module SqlServerDSC Import-DscResource -Module xFailoverCluster Node $AllNodes.NodeName @@ -126,8 +126,8 @@ Configuration SQL RetryIntervalSec = 5 RetryCount = 720 } - - xSQLServerFailoverClusterSetup "CompleteMSSQLSERVER" + + SqlServerDSCFailoverClusterSetup "CompleteMSSQLSERVER" { DependsOn = @( "[WaitForAll]Cluster", diff --git a/Examples/SQL-Standalone.ps1 b/Examples/SQL-Standalone.ps1 index 9f52781f8..1bc4498bc 100644 --- a/Examples/SQL-Standalone.ps1 +++ b/Examples/SQL-Standalone.ps1 @@ -5,7 +5,7 @@ param () Configuration SQLSA { - Import-DscResource -Module xSQLServer + Import-DscResource -Module SqlServerDSC # Set role and instance variables $Roles = $AllNodes.Roles | Sort-Object -Unique @@ -20,7 +20,7 @@ Configuration SQLSA $Role.Contains("Database") -or $Role.Contains("Datawarehouse") -or $Role.Contains("Reporting") -or - $Role.Contains("Analysis") -or + $Role.Contains("Analysis") -or $Role.Contains("Integration") ) { @@ -28,7 +28,7 @@ Configuration SQLSA Set-Variable -Name ($Role.Replace(" ","").Replace(".","").Replace("Server","Instance")) -Value $Instance } } - } + } Node $AllNodes.NodeName { diff --git a/Examples/SQLPush_SingleServer.ps1 b/Examples/SQLPush_SingleServer.ps1 index 209598d4f..c615061e1 100644 --- a/Examples/SQLPush_SingleServer.ps1 +++ b/Examples/SQLPush_SingleServer.ps1 @@ -33,7 +33,7 @@ foreach ($computer in $computers) Configuration SQLSA { Import-DscResource –Module PSDesiredStateConfiguration - Import-DscResource -Module xSQLServer + Import-DscResource -Module SqlServerDSC Node $AllNodes.NodeName { @@ -79,7 +79,7 @@ Configuration SQLSA Features = $Node.Features } - xSQLServerMemory ($Node.Nodename) + SqlServerMemory ($Node.Nodename) { DependsOn = ("[xSqlServerSetup]" + $Node.NodeName) Ensure = "Present" @@ -87,13 +87,13 @@ Configuration SQLSA MinMemory = "256" MaxMemory ="1024" } - xSQLServerMaxDop($Node.Nodename) + SqlServerMaxDop($Node.Nodename) { DependsOn = ("[xSqlServerSetup]" + $Node.NodeName) Ensure = "Present" DynamicAlloc = $true } - xSQLServerLogin($Node.Nodename+"TestUser2") + SqlServerLogin($Node.Nodename+"TestUser2") { DependsOn = ("[xSqlServerSetup]" + $Node.NodeName) Ensure = "Present" @@ -101,7 +101,7 @@ Configuration SQLSA LoginCredential = $Node.InstallerServiceAccount LoginType = "SQLLogin" } - xSQLServerLogin($Node.Nodename+"TestUser1") + SqlServerLogin($Node.Nodename+"TestUser1") { DependsOn = ("[xSqlServerSetup]" + $Node.NodeName) Ensure = "Present" @@ -109,7 +109,7 @@ Configuration SQLSA LoginCredential = $Node.InstallerServiceAccount LoginType = "SQLLogin" } - xSQLServerDatabaseRole($Node.Nodename) + SqlDatabaseRole($Node.Nodename) { DependsOn = ("[xSqlServerSetup]" + $Node.NodeName) Ensure = "Present" @@ -123,18 +123,18 @@ Configuration SQLSA RecoveryModel = "Full" SqlServerInstance ="$($Node.NodeName)\$($Node.SQLInstanceName)" } - xSQLServerDatabaseOwner($Node.Nodename) + SqlDatabaseOwner($Node.Nodename) { Database = "TestDB" Name = "TestUser2" } - xSQLServerDatabasePermission($Node.Nodename) + SqlDatabasePermission($Node.Nodename) { Database = "Model" Name = "TestUser1" Permissions ="SELECT","DELETE" } - xSQLServerDatabase($Node.Nodename) + SqlDatabase($Node.Nodename) { Database = "Test3" Ensure = "Present" @@ -165,7 +165,7 @@ ForEach ($computer in $computers) { } $Destination = "\\"+$computer+"\\c$\Program Files\WindowsPowerShell\Modules" - Copy-Item 'C:\Program Files\WindowsPowerShell\Modules\xSQLServer' -Destination $Destination -Recurse -Force + Copy-Item 'C:\Program Files\WindowsPowerShell\Modules\SqlServerDSC' -Destination $Destination -Recurse -Force } SQLSA -ConfigurationData $ConfigurationData -OutputPath $OutputPath diff --git a/README.md b/README.md index 499516b9c..04837d120 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# xSQLServer +# SqlServerDSC -The **xSQLServer** module contains DSC resources for deployment and configuration -of SQL Server. +The **SqlServerDSC** module contains DSC resources +for deployment and configuration of SQL Server. This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) @@ -15,39 +15,44 @@ questions or comments. [![Build status](https://ci.appveyor.com/api/projects/status/mxn453y284eab8li/branch/master?svg=true)](https://ci.appveyor.com/project/PowerShell/xsqlserver/branch/master) [![codecov](https://codecov.io/gh/PowerShell/xSQLServer/branch/master/graph/badge.svg)](https://codecov.io/gh/PowerShell/xSQLServer/branch/master) -This is the branch containing the latest release - no contributions should be made -directly to this branch. +This is the branch containing the latest release - +no contributions should be made directly to this branch. ### dev [![Build status](https://ci.appveyor.com/api/projects/status/mxn453y284eab8li/branch/dev?svg=true)](https://ci.appveyor.com/project/PowerShell/xsqlserver/branch/dev) [![codecov](https://codecov.io/gh/PowerShell/xSQLServer/branch/dev/graph/badge.svg)](https://codecov.io/gh/PowerShell/xSQLServer/branch/dev) -This is the development branch to which contributions should be proposed by contributors -as pull requests. This development branch will periodically be merged to the master -branch, and be released to [PowerShell Gallery](https://www.powershellgallery.com/). +This is the development branch +to which contributions should be proposed by contributors as pull requests. +This development branch will periodically be merged to the master branch, +and be released to [PowerShell Gallery](https://www.powershellgallery.com/). ## Contributing -Regardless of the way you want to contribute we are tremendously happy to have you -here. - -There are several ways you can contribute. You can submit an issue to report a bug. -You can submit an issue to request an improvement. You can take part in discussions -for issues. You can review pull requests and comment on other contributors changes. -You can also improve the resources and tests, or even create new resources, by -sending in pull requests yourself. - -* If you want to submit an issue or take part in discussions, please browse the - list of [issues](https://github.com/PowerShell/xSQLServer/issues). Please check - out [Contributing to the DSC Resource Kit](https://github.com/PowerShell/DscResources/blob/master/CONTRIBUTING.md) +Regardless of the way you want to contribute +we are tremendously happy to have you here. + +There are several ways you can contribute. +You can submit an issue to report a bug. +You can submit an issue to request an improvement. +You can take part in discussions for issues. +You can review pull requests and comment on other contributors changes. +You can also improve the resources and tests, +or even create new resources, +by sending in pull requests yourself. + +* If you want to submit an issue or take part in discussions, + please browse the list of [issues](https://github.com/PowerShell/xSQLServer/issues). + Please check out [Contributing to the DSC Resource Kit](https://github.com/PowerShell/DscResources/blob/master/CONTRIBUTING.md) on how to work with issues. -* If you want to review pull requests, please first check out the - [Review Pull Request guidelines](https://github.com/PowerShell/DscResources/blob/master/CONTRIBUTING.md#reviewing-pull-requests), +* If you want to review pull requests, + please first check out the [Review Pull Request guidelines](https://github.com/PowerShell/DscResources/blob/master/CONTRIBUTING.md#reviewing-pull-requests), and the browse the list of [pull requests](https://github.com/PowerShell/xSQLServer/pulls) and look for those pull requests with label 'needs review'. -* If you want to improve the resources or tests, or create a new resource, then - please check out the following guidelines. +* If you want to improve the resources or tests, + or create a new resource, + then please check out the following guidelines. * The [Contributing to the DSC Resource Kit](https://github.com/PowerShell/DscResources/blob/master/CONTRIBUTING.md) guidelines. * The specific [Contributing to xSQLServer](https://github.com/PowerShell/xSQLServer/blob/dev/CONTRIBUTING.md) @@ -56,45 +61,47 @@ sending in pull requests yourself. * The common [Best Practices](https://github.com/PowerShell/DscResources/blob/master/BestPractices.md) guidelines. * The common [Testing Guidelines](https://github.com/PowerShell/DscResources/blob/master/TestsGuidelines.md). - * If you are new to GitHub (and git), then please check out - [Getting Started with GitHub](https://github.com/PowerShell/DscResources/blob/master/GettingStartedWithGitHub.md). + * If you are new to GitHub (and git), + then please check out [Getting Started with GitHub](https://github.com/PowerShell/DscResources/blob/master/GettingStartedWithGitHub.md). * If you are new to Pester and writing test, then please check out [Getting started with Pester](https://github.com/PowerShell/DscResources/blob/master/GettingStartedWithPester.md). -If you need any help along the way, don't be afraid to ask. We are here for each -other. +If you need any help along the way, +don't be afraid to ask. +We are here for each other. ## Installation -To manually install the module, download the source code and unzip the contents -of the '\Modules\xSQLServer' directory to the +To manually install the module, +download the source code and unzip the contents +of the '\Modules\SqlServerDSC' directory to the '$env:ProgramFiles\WindowsPowerShell\Modules' folder. -To install from the PowerShell gallery using PowerShellGet (in PowerShell 5.0) run -the following command: +To install from the PowerShell gallery using PowerShellGet (in PowerShell 5.0) +run the following command: ```powershell -Find-Module -Name xSQLServer -Repository PSGallery | Install-Module +Find-Module -Name SqlServerDSC -Repository PSGallery | Install-Module ``` To confirm installation, run the below command and ensure you see the SQL Server DSC resources available: ```powershell -Get-DscResource -Module xSQLServer +Get-DscResource -Module SqlServerDSC ``` ## Requirements -The minimum Windows Management Framework (PowerShell) version required is 5.0 or -higher, which ships with Windows 10 or Windows Server 2016, but can also be -installed on Windows 7 SP1, Windows 8.1, Windows Server 2008 R2 SP1, +The minimum Windows Management Framework (PowerShell) version required is 5.0 or higher, +which ships with Windows 10 or Windows Server 2016, +but can also be installed on Windows 7 SP1, Windows 8.1, Windows Server 2008 R2 SP1, Windows Server 2012 and Windows Server 2012 R2. ## Examples -You can review the [Examples](/Examples) directory in the xSQLServer module for -some general use scenarios for all of the resources that are in the module. +You can review the [Examples](/Examples) directory in the SqlServerDSC module +for some general use scenarios for all of the resources that are in the module. ## Change log @@ -102,62 +109,62 @@ A full list of changes in each version can be found in the [change log](CHANGELO ## Resources -* [**xSQLServerAlias**](#xsqlserveralias) resource to manage SQL Server client Aliases. -* [**xSQLServerAlwaysOnAvailabilityGroup**](#xsqlserveralwaysonavailabilitygroup) +* [**SqlAlias**](#sqlalias) resource to manage SQL Server client Aliases. +* [**SqlAG**](#sqlag) resource to ensure an availability group is present or absent. -* [**xSQLServerAlwayOnAvailabilityGroupDatabaseMembership**](#xsqlserveralwaysonavailabilitygroupdatabasemembership) +* [**SqlAGDatabases**](#sqlagdatabases) to manage the database membership in Availability Groups. -* [**xSQLServerAlwaysOnAvailabilityGroupReplica**](#xsqlserveralwaysonavailabilitygroupreplica) +* [**SqlAGReplica**](#sqlagreplica) resource to ensure an availability group replica is present or absent. -* [**xSQLServerAlwaysOnService**](#xsqlserveralwaysonservice) resource to enable +* [**SqlAlwaysOnService**](#sqlalwaysonservice) resource to enable always on on a SQL Server. -* [**xSQLServerAvailabilityGroupListener**](#xsqlserveravailabilitygrouplistener) +* [**SqlAGListener**](#sqlaglistener) Create or remove an availability group listener. -* [**xSQLServerConfiguration**](#xsqlserverconfiguration) resource to manage +* [**SqlServerConfiguration**](#sqlserverconfiguration) resource to manage [SQL Server Configuration Options](https://msdn.microsoft.com/en-us/library/ms189631.aspx). -* [**xSQLServerDatabase**](#xsqlserverdatabase) resource to manage ensure database +* [**SqlDatabase**](#sqldatabase) resource to manage ensure database is present or absent. -* [**xSQLServerDatabaseDefaultLocation**](#xsqlserverdatabasedefaultlocation) resource +* [**SqlDatabaseDefaultLocation**](#sqldatabasedefaultlocation) resource to manage default locations for Data, Logs, and Backups for SQL Server -* [**xSQLServerDatabaseOwner**](#xsqlserverdatabaseowner) resource to manage SQL +* [**SqlDatabaseOwner**](#sqldatabaseowner) resource to manage SQL database owners. -* [**xSQLServerDatabasePermission**](#xsqlserverdatabasepermission) resource to +* [**SqlDatabasePermission**](#sqldatabasepermission) resource to manage SQL database permissions. -* [**xSQLServerDatabaseRecoveryModel**](#xsqlserverdatabaserecoverymodel) resource +* [**SqlDatabaseRecoveryModel**](#sqlserverrecoverymodel) resource to manage database recovery model. -* [**xSQLServerDatabaseRole**](#xsqlserverdatabaserole) resource to manage SQL +* [**SqlDatabaseRole**](#sqldatabaserole) resource to manage SQL database roles. -* [**xSQLServerEndpoint**](#xsqlserverendpoint) resource to ensure database endpoint +* [**SqlServerEndpoint**](#sqlserverendpoint) resource to ensure database endpoint is present or absent. -* [**xSQLServerEndpointPermission**](#xsqlserverendpointpermission) Grant or revoke +* [**SqlServerEndpointPermission**](#sqlserverendpointpermission) Grant or revoke permission on the endpoint. -* [**xSQLServerEndpointState**](#xsqlserverendpointstate) Change state of the endpoint. -* [**xSQLServerFirewall**](#xsqlserverfirewall) configures firewall settings to +* [**SqlServerEndpointState**](#sqlserverendpointstate) Change state of the endpoint. +* [**SqlWindowsFirewall**](#sqlwindowsfirewall) configures firewall settings to allow remote access to a SQL Server instance. -* [**xSQLServerLogin**](#xsqlserverlogin) resource to manage SQL logins. -* [**xSQLServerMaxDop**](#xsqlservermaxdop) resource to manage MaxDegree of Parallelism +* [**SqlServerLogin**](#sqlserverlogin) resource to manage SQL logins. +* [**SqlServerMaxDop**](#sqlservermaxdop) resource to manage MaxDegree of Parallelism for SQL Server. -* [**xSQLServerMemory**](#xsqlservermemory) resource to manage Memory for SQL Server. -* [**xSQLServerNetwork**](#xsqlservernetwork) resource to manage SQL Server Network +* [**SqlServerMemory**](#sqlservermemory) resource to manage Memory for SQL Server. +* [**SqlServerNetwork**](#sqlservernetwork) resource to manage SQL Server Network Protocols. -* [**xSQLServerPermission**](#xsqlserverpermission) Grant or revoke permission on +* [**SqlServerPermission**](#sqlserverpermission) Grant or revoke permission on the SQL Server. -* [**xSQLServerRole**](#xsqlserverrole) resource to manage SQL server roles. -* [**xSQLServerReplication**](#xsqlserverreplication) resource to manage SQL Replication +* [**SqlServerRole**](#sqlserverrole) resource to manage SQL server roles. +* [**SqlServerReplication**](#sqlserverreplication) resource to manage SQL Replication distribution and publishing. -* [**xSQLServerRSConfig**](#xsqlserverrsconfig) configures SQL Server Reporting +* [**SqlRS**](#sqlrs) configures SQL Server Reporting Services to use a database engine in another instance. -* [**xSQLServerRSSecureConnectionLevel**](#xsqlserverrssecureconnectionlevel) sets +* [**SqlRSSecureConnectionLevel**](#sqlrssecureconnectionlevel) sets the secure connection level for SQL Server Reporting Services. -* [**xSQLServerScript**](#xsqlserverscript) resource to extend DSC Get/Set/Test +* [**SqlScript**](#sqlscript) resource to extend DSC Get/Set/Test functionality to T-SQL. -* [**xSQLServerServiceAccount**](#xsqlserverserviceaccount) Manage the service account +* [**SqlServerServiceAccount**](#sqlserverserviceaccount) Manage the service account for SQL Server services. -* [**xSQLServerSetup**](#xsqlserversetup) installs a standalone SQL Server instance. -* [**xWaitForAvailabilityGroup**](#xwaitforavailabilitygroup) resource to wait until +* [**SqlSetup**](#sqlsetup) installs a standalone SQL Server instance. +* [**SqlWaitForAvailabilityGroup**](#sqlwaitforavailabilitygroup) resource to wait until availability group is created on primary server. -### xSQLServerAlias +### SqlAlias No description. @@ -187,10 +194,10 @@ No description. #### Examples -* [Add an SQL Server alias](/Examples/Resources/xSQLServerAlias/1-AddSQLServerAlias.ps1) -* [Remove an SQL Server alias](/Examples/Resources/xSQLServerAlias/2-RemoveSQLServerAlias.ps1) +* [Add an SQL Server alias](/Examples/Resources/SqlAlias/1-AddSqlAlias.ps1) +* [Remove an SQL Server alias](/Examples/Resources/SqlAlias/2-RemoveSqlAlias.ps1) -### xSQLServerAlwaysOnAvailabilityGroup +### SqlAG This resource is used to create, remove, and update an Always On Availability Group. It will also manage the Availability Group replica on the specified node. @@ -264,11 +271,11 @@ It will also manage the Availability Group replica on the specified node. #### Examples -* [Add a SQL Server Always On Availability Group](/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroup/1-CreateAvailabilityGroup.ps1) -* [Add a SQL Server Always On Availability Group and explicitly defines its properties](/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroup/3-CreateAvailabilityGroupDetailed.ps1) -* [Remove a SQL Server Always On Availability Group](/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroup/2-RemoveAvailabilityGroup.ps1) +* [Add a SQL Server Always On Availability Group](/Examples/Resources/SqlAG/1-CreateAvailabilityGroup.ps1) +* [Add a SQL Server Always On Availability Group and explicitly defines its properties](/Examples/Resources/SqlAG/3-CreateAvailabilityGroupDetailed.ps1) +* [Remove a SQL Server Always On Availability Group](/Examples/Resources/SqlAG/2-RemoveAvailabilityGroup.ps1) -### xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership +### SqlAGDatabaseMembership This resource is used to add and/or remove databases to a specified availability group. @@ -323,7 +330,7 @@ group. * **`[Boolean]` IsActiveNode** _(Read)_: Determines if the current node is actively hosting the SQL Server instance. -### xSQLServerAlwaysOnAvailabilityGroupReplica +### SqlAGReplica This resource is used to create, remove, and update an Always On Availability Group Replica. @@ -391,10 +398,10 @@ Always On Availability Group Replica. #### Examples -* [Add a SQL Server Always On Availability Group Replica](/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroupReplica/1-CreateAvailabilityGroupReplica.ps1) -* [Remove a SQL Server Always On Availability Group Replica](/Examples/Resources/xSQLServerAlwaysOnAvailabilityGroupReplica/2-RemoveAvailabilityGroupReplica.ps1) +* [Add a SQL Server Always On Availability Group Replica](/Examples/Resources/SqlAGReplica/1-CreateAvailabilityGroupReplica.ps1) +* [Remove a SQL Server Always On Availability Group Replica](/Examples/Resources/SqlAGReplica/2-RemoveAvailabilityGroupReplica.ps1) -### xSQLServerAlwaysOnService +### SqlAlwaysOnService Enables or disabled SQL Server Always On high availability and disaster recovery (Always On HADR). @@ -421,10 +428,10 @@ Enables or disabled SQL Server Always On high availability and disaster recovery #### Examples -* [Enable SQL Server Always On](/Examples/Resources/xSQLServerAlwaysOnService/1-EnableAlwaysOn.ps1) -* [Disable SQL Server Always On](/Examples/Resources/xSQLServerAlwaysOnService/1-DisableAlwaysOn.ps1) +* [Enable SQL Server Always On](/Examples/Resources/SqlAlwaysOnService/1-EnableAlwaysOn.ps1) +* [Disable SQL Server Always On](/Examples/Resources/SqlAlwaysOnService/1-DisableAlwaysOn.ps1) -### xSQLServerAvailabilityGroupListener +### SqlAGListener No description. @@ -460,17 +467,17 @@ No description. #### Examples * [Adds an Availability Group listener with the same name as the - Availability Group VCO](/Examples/Resources/xSQLServerAvailabilityGroupListener/1-AddAvailabilityGroupListenerWithSameNameAsVCO.ps1) + Availability Group VCO](/Examples/Resources/SqlAGListener/1-AddAvailabilityGroupListenerWithSameNameAsVCO.ps1) * [Adds an Availability Group listener with a different name than the - Availability Group VCO](/Examples/Resources/xSQLServerAvailabilityGroupListener/2-AddAvailabilityGroupListenerWithDifferentNameAsVCO.ps1) + Availability Group VCO](/Examples/Resources/SqlAGListener/2-AddAvailabilityGroupListenerWithDifferentNameAsVCO.ps1) * [Removes an Availability Group listener with the same name as the - Availability Group VCO](/Examples/Resources/xSQLServerAvailabilityGroupListener/3-RemoveAvailabilityGroupListenerWithSameNameAsVCO.ps1) + Availability Group VCO](/Examples/Resources/SqlAGListener/3-RemoveAvailabilityGroupListenerWithSameNameAsVCO.ps1) * [Removes an Availability Group listener with a different name than the - Availability Group VCO](/Examples/Resources/xSQLServerAvailabilityGroupListener/4-RemoveAvailabilityGroupListenerWithDifferentNameAsVCO.ps1) -* [Adds an Availability Group listener using DHCP on the default server subnet](/Examples/Resources/xSQLServerAvailabilityGroupListener/5-AddAvailabilityGroupListenerUsingDHCPWithDefaultServerSubnet.ps1) -* [Adds an Availability Group listener using DHCP with a specific subnet](/Examples/Resources/xSQLServerAvailabilityGroupListener/6-AddAvailabilityGroupListenerUsingDHCPWithSpecificSubnet.ps1) + Availability Group VCO](/Examples/Resources/SqlAGListener/4-RemoveAvailabilityGroupListenerWithDifferentNameAsVCO.ps1) +* [Adds an Availability Group listener using DHCP on the default server subnet](/Examples/Resources/SqlAGListener/5-AddAvailabilityGroupListenerUsingDHCPWithDefaultServerSubnet.ps1) +* [Adds an Availability Group listener using DHCP with a specific subnet](/Examples/Resources/SqlAGListener/6-AddAvailabilityGroupListenerUsingDHCPWithSpecificSubnet.ps1) -### xSQLServerConfiguration +### SqlServerConfiguration No description. @@ -495,10 +502,10 @@ No description. #### Examples -* [Configure two instances on the same server to have CLR enabled](/Examples/Resources/xSQLServerConfiguration/1-ConfigureTwoInstancesOnTheSameServerToEnableClr.ps1) -* [Configure a instance to have 'Priority Boost' enabled](/Examples/Resources/xSQLServerConfiguration/2-ConfigureInstanceToEnablePriorityBoost.ps1) +* [Configure two instances on the same server to have CLR enabled](/Examples/Resources/SqlServerConfiguration/1-ConfigureTwoInstancesOnTheSameServerToEnableClr.ps1) +* [Configure a instance to have 'Priority Boost' enabled](/Examples/Resources/SqlServerConfiguration/2-ConfigureInstanceToEnablePriorityBoost.ps1) -### xSQLServerDatabase +### SqlDatabase This resource is used to create or delete a database. For more information about database, please read: @@ -523,10 +530,10 @@ database, please read: #### Examples -* [Create a Database](/Examples/Resources/xSQLServerDatabase/1-CreateDatabase.ps1) -* [Delete a database](/Examples/Resources/xSQLServerDatabase/2-DeleteDatabase.ps1) +* [Create a Database](/Examples/Resources/SqlDatabase/1-CreateDatabase.ps1) +* [Delete a database](/Examples/Resources/SqlDatabase/2-DeleteDatabase.ps1) -### xSQLServerDatabaseDefaultLocation +### SqlDatabaseDefaultLocation This resource is used to configure default locations for user databases. The types of default locations that can be changed are Data, Log, and Backup. For @@ -560,9 +567,9 @@ more information about database default locations, please read the article #### Examples -* [Set database default locations](/Examples/Resources/xSQLServerDatabaseDefaultLocation/1-SetDatabaseDefaultLocation.ps1) +* [Set database default locations](/Examples/Resources/SqlDatabaseDefaultLocation/1-SetDatabaseDefaultLocation.ps1) -### xSQLServerDatabaseOwner +### SqlDatabaseOwner This resource is used to configure the owner of a database. For more information about database owner, please read the article @@ -583,9 +590,9 @@ For more information about database owner, please read the article #### Examples -* [Set database owner](/Examples/Resources/xSQLServerDatabaseOwner/1-SetDatabaseOwner.ps1) +* [Set database owner](/Examples/Resources/SqlDatabaseOwner/1-SetDatabaseOwner.ps1) -### xSQLServerDatabasePermission +### SqlDatabasePermission This resource is used to grant, deny or revoke permissions for a user in a database. For more information about permissions, please read the article @@ -619,11 +626,11 @@ will also get their permission revoked. #### Examples -* [Grant Database Permission](/Examples/Resources/xSQLServerDatabasePermission/1-GrantDatabasePermissions.ps1) -* [Revoke Database Permission](/Examples/Resources/xSQLServerDatabasePermission/2-RevokeDatabasePermissions.ps1) -* [Deny Database Permission](/Examples/Resources/xSQLServerDatabasePermission/3-DenyDatabasePermissions.ps1) +* [Grant Database Permission](/Examples/Resources/SqlDatabasePermission/1-GrantDatabasePermissions.ps1) +* [Revoke Database Permission](/Examples/Resources/SqlDatabasePermission/2-RevokeDatabasePermissions.ps1) +* [Deny Database Permission](/Examples/Resources/SqlDatabasePermission/3-DenyDatabasePermissions.ps1) -### xSQLServerDatabaseRecoveryModel +### SqlDatabaseRecoveryModel This resource set the recovery model for a database. The recovery model controls how transactions are logged, whether the transaction log requires (and allows) @@ -647,9 +654,9 @@ Read more about recovery model in this article #### Examples -* [Set the RecoveryModel of a database](/Examples/Resources/xSQLServerDatabaseRecoveryModel/1-SetDatabaseRecoveryModel.ps1) +* [Set the RecoveryModel of a database](/Examples/Resources/SqlDatabaseRecoveryModel/1-SetDatabaseRecoveryModel.ps1) -### xSQLServerDatabaseRole +### SqlDatabaseRole This resource is used to add or remove role for a login in a database. Read more about database role in this article [CREATE ROLE (Transact-SQL)](https://msdn.microsoft.com/en-us/library/ms187936.aspx) @@ -675,18 +682,18 @@ Read more about database role in this article [CREATE ROLE (Transact-SQL)](https #### Examples -* [Add Role of a database](/Examples/Resources/xSQLServerDatabaseRole/1-AddDatabaseRole.ps1) -* [Remove Role of a database](/Examples/Resources/xSQLServerDatabaseRole/2-RemoveDatabaseRole.ps1) +* [Add Role of a database](/Examples/Resources/SqlDatabaseRole/1-AddDatabaseRole.ps1) +* [Remove Role of a database](/Examples/Resources/SqlDatabaseRole/2-RemoveDatabaseRole.ps1) -### xSQLServerEndpoint +### SqlServerEndpoint This resource is used to create an endpoint. Currently it only supports creating a database mirror endpoint which can be used by, for example, AlwaysOn. >Note: The endpoint will be started after creation, but will not be enforced. Please -use [**xSQLServerEndpointState**](#xsqlserverendpointstate) to make sure the endpoint +use [**SqlServerEndpointState**](#xsqlserverendpointstate) to make sure the endpoint remains in started state. To set connect permission to the endpoint, please use -the resource [**xSQLServerEndpointPermission**](#xsqlserverendpointpermission). +the resource [**SqlServerEndpointPermission**](#xsqlserverendpointpermission). #### Requirements @@ -715,7 +722,7 @@ the resource [**xSQLServerEndpointPermission**](#xsqlserverendpointpermission). None. -### xSQLServerEndpointPermission +### SqlServerEndpointPermission This resource is used to give connect permission to an endpoint for a user (login). @@ -737,15 +744,15 @@ This resource is used to give connect permission to an endpoint for a user (logi #### Examples -* [Add connect permission to an Endpoint](/Examples/Resources/xSQLServerEndpointPermission/1-AddConnectPermission.ps1) -* [Remove the connect permission for an Endpoint](/Examples/Resources/xSQLServerEndpointPermission/2-RemoveConnectPermission.ps1) +* [Add connect permission to an Endpoint](/Examples/Resources/SqlServerEndpointPermission/1-AddConnectPermission.ps1) +* [Remove the connect permission for an Endpoint](/Examples/Resources/SqlServerEndpointPermission/2-RemoveConnectPermission.ps1) * [Add connect permission to both an Always On primary replica and an Always On - secondary replica, and where each replica has a different SQL service account](/Examples/Resources/xSQLServerEndpointPermission/3-AddConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1) + secondary replica, and where each replica has a different SQL service account](/Examples/Resources/SqlServerEndpointPermission/3-AddConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1) * [Remove connect permission to both an Always On primary replica and an Always On secondary replica, and where each replica has a different SQL service - account](/Examples/Resources/xSQLServerEndpointPermission/4-RemoveConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1) + account](/Examples/Resources/SqlServerEndpointPermission/4-RemoveConnectPermissionToAlwaysOnPrimaryAndSecondaryReplicaEachWithDifferentSqlServiceAccounts.ps1) -### xSQLServerEndpointState +### SqlServerEndpointState This resource is used to set the state of an endpoint. @@ -770,10 +777,10 @@ This resource is used to set the state of an endpoint. #### Examples -* [Make sure that an endpoint is started](/Examples/Resources/xSQLServerEndpointState/1-MakeSureEndpointIsStarted.ps1) -* [Make sure that an endpoint is stopped](/Examples/Resources/xSQLServerEndpointState/2-MakeSureEndpointIsStopped.ps1) +* [Make sure that an endpoint is started](/Examples/Resources/SqlServerEndpointState/1-MakeSureEndpointIsStarted.ps1) +* [Make sure that an endpoint is stopped](/Examples/Resources/SqlServerEndpointState/2-MakeSureEndpointIsStopped.ps1) -### xSQLServerFirewall +### SqlWindowsFirewall This will set default firewall rules for the supported features. Currently the features supported are Database Engine, Analysis Services, SQL Browser, @@ -855,10 +862,10 @@ Port: tcp/135 | SQL Server Integration Services Port #### Examples -* [Create inbound firewall rules](/Examples/Resources/xSQLServerFirewall/1-CreateInboundFirewallRules.ps1) -* [Remove inbound firewall rules](/Examples/Resources/xSQLServerFirewall/2-RemoveInboundFirewallRules.ps1) +* [Create inbound firewall rules](/Examples/Resources/SqlWindowsFirewall/1-CreateInboundFirewallRules.ps1) +* [Remove inbound firewall rules](/Examples/Resources/SqlWindowsFirewall/2-RemoveInboundFirewallRules.ps1) -### xSQLServerLogin +### SqlServerLogin No description. @@ -896,7 +903,7 @@ No description. None. -### xSQLServerMaxDop +### SqlServerMaxDop This resource set the max degree of parallelism server configuration option. The max degree of parallelism option is used to limit the number of processors to @@ -946,11 +953,11 @@ Read more about max degree of parallelism in this article #### Examples -* [Set SQLServerMaxDop to 1](/Examples/Resources/xSQLServerMaxDop/1-SetMaxDopToOne.ps1) -* [Set SQLServerMaxDop to Auto](/Examples/Resources/xSQLServerMaxDop/2-SetMaxDopToAuto.ps1) -* [Set SQLServerMaxDop to Default](/Examples/Resources/xSQLServerMaxDop/3-SetMaxDopToDefault.ps1) +* [Set SQLServerMaxDop to 1](/Examples/Resources/SqlServerMaxDop/1-SetMaxDopToOne.ps1) +* [Set SQLServerMaxDop to Auto](/Examples/Resources/SqlServerMaxDop/2-SetMaxDopToAuto.ps1) +* [Set SQLServerMaxDop to Default](/Examples/Resources/SqlServerMaxDop/3-SetMaxDopToDefault.ps1) -### xSQLServerMemory +### SqlServerMemory This resource sets the minimum server memory and maximum server memory configuration option. @@ -1021,12 +1028,12 @@ SQL Max Memory = TotalPhysicalMemory - (NumOfSQLThreads\*ThreadStackSize) - #### Examples -* [Set SQLServerMaxMemory to 12GB](/Examples/Resources/xSQLServerMemory/1-SetMaxMemoryTo12GB.ps1) -* [Set SQLServerMaxMemory to Auto](/Examples/Resources/xSQLServerMemory/2-SetMaxMemoryToAuto.ps1) -* [Set SQLServerMinMemory to 2GB and SQLServerMaxMemory to Auto](/Examples/Resources/xSQLServerMemory/3-SetMinMemoryToFixedValueAndMaxMemoryToAuto.ps1) -* [Set SQLServerMaxMemory to Default](/Examples/Resources/xSQLServerMemory/3-SetMaxMemoryToDefault.ps1) +* [Set SQLServerMaxMemory to 12GB](/Examples/Resources/SqlServerMemory/1-SetMaxMemoryTo12GB.ps1) +* [Set SQLServerMaxMemory to Auto](/Examples/Resources/SqlServerMemory/2-SetMaxMemoryToAuto.ps1) +* [Set SQLServerMinMemory to 2GB and SQLServerMaxMemory to Auto](/Examples/Resources/SqlServerMemory/3-SetMinMemoryToFixedValueAndMaxMemoryToAuto.ps1) +* [Set SQLServerMaxMemory to Default](/Examples/Resources/SqlServerMemory/3-SetMaxMemoryToDefault.ps1) -### xSQLServerNetwork +### SqlServerNetwork This resource is used to change the network settings for the instance. @@ -1063,10 +1070,10 @@ Read more about the network settings in the article #### Examples -* [Enable TCP/IP with static port and restart SQL Server](/Examples/Resources/xSQLServerNetwork/1-EnableTcpIpWithStaticPort.ps1) -* [Enable TCP/IP with dynamic port](/Examples/Resources/xSQLServerNetwork/2-EnableTcpIpWithDynamicPort.ps1) +* [Enable TCP/IP with static port and restart SQL Server](/Examples/Resources/SqlServerNetwork/1-EnableTcpIpWithStaticPort.ps1) +* [Enable TCP/IP with dynamic port](/Examples/Resources/SqlServerNetwork/2-EnableTcpIpWithDynamicPort.ps1) -### xSQLServerPermission +### SqlServerPermission This resource sets server permissions to a user (login). @@ -1094,10 +1101,10 @@ AlterAnyEndPoint and ViewServerState. #### Examples -* [Add server permission for a login](/Examples/Resources/xSQLServerPermission/1-AddServerPermissionForLogin.ps1) -* [Remove server permission for a login](/Examples/Resources/xSQLServerPermission/2-RemoveServerPermissionForLogin.ps1) +* [Add server permission for a login](/Examples/Resources/SqlServerPermission/1-AddServerPermissionForLogin.ps1) +* [Remove server permission for a login](/Examples/Resources/SqlServerPermission/2-RemoveServerPermissionForLogin.ps1) -### xSQLServerReplication +### SqlServerReplication No description. @@ -1130,10 +1137,10 @@ No description. #### Examples -* [Configure a instance as the distributor](/Examples/Resources/xSQLServerReplication/1-ConfigureInstanceAsDistributor.ps1) -* [Configure a instance as the publisher](/Examples/Resources/xSQLServerReplication/2-ConfigureInstanceAsPublisher.ps1) +* [Configure a instance as the distributor](/Examples/Resources/SqlServerReplication/1-ConfigureInstanceAsDistributor.ps1) +* [Configure a instance as the publisher](/Examples/Resources/SqlServerReplication/2-ConfigureInstanceAsPublisher.ps1) -### xSQLServerRole +### SqlServerRole This resource is used to create a server role, when Ensure is set to 'Present'. Or remove a server role, when Ensure is set to 'Absent'. The resource also manages @@ -1169,13 +1176,13 @@ server roles, please read the below articles. #### Examples -* [Add server role](/Examples/Resources/xSQLServerRole/1-AddServerRole.ps1) -* [Remove server role](/Examples/Resources/xSQLServerRole/2-RemoveServerRole.ps1) -* [Add members to server role](/Examples/Resources/xSQLServerRole/3-AddMembersToServerRole.ps1) -* [Members to include in server role](/Examples/Resources/xSQLServerRole/4-MembersToIncludeInServerRole.ps1) -* [Members to exclude from server role](/Examples/Resources/xSQLServerRole/5-MembersToExcludeInServerRole.ps1) +* [Add server role](/Examples/Resources/SqlServerRole/1-AddServerRole.ps1) +* [Remove server role](/Examples/Resources/SqlServerRole/2-RemoveServerRole.ps1) +* [Add members to server role](/Examples/Resources/SqlServerRole/3-AddMembersToServerRole.ps1) +* [Members to include in server role](/Examples/Resources/SqlServerRole/4-MembersToIncludeInServerRole.ps1) +* [Members to exclude from server role](/Examples/Resources/SqlServerRole/5-MembersToExcludeInServerRole.ps1) -### xSQLServerRSConfig +### SqlRS Initializes and configures SQL Reporting Services server. @@ -1212,10 +1219,10 @@ Initializes and configures SQL Reporting Services server. #### Examples -* [Default configuration](Examples/Resources/xSQLServerRSConfig/1-DefaultConfiguration.ps1) -* [Custom virtual directories and reserved URLs](Examples/Resources/xSQLServerRSConfig/2-CustomConfiguration.ps1) +* [Default configuration](Examples/Resources/SqlRS/1-DefaultConfiguration.ps1) +* [Custom virtual directories and reserved URLs](Examples/Resources/SqlRS/2-CustomConfiguration.ps1) -### xSQLServerRSSecureConnectionLevel +### SqlRSSecureConnectionLevel No description. @@ -1237,7 +1244,7 @@ No description. None. -### xSQLServerScript +### SqlScript Provides the means to run a user generated T-SQL script on the SQL Server instance. Three scripts are required; Get T-SQL script, Set T-SQL script and the Test T-SQL @@ -1306,10 +1313,10 @@ See [issue #273](https://github.com/PowerShell/xSQLServer/issues/273) for more i #### Examples -* [Run a script using SQL Authentication](/Examples/Resources/xSQLServerScript/1-RunScriptUsingSQLAuthentication.ps1) -* [Run a script using Windows Authentication](/Examples/Resources/xSQLServerScript/2-RunScriptUsingWindowsAuthentication.ps1) +* [Run a script using SQL Authentication](/Examples/Resources/SqlScript/1-RunScriptUsingSQLAuthentication.ps1) +* [Run a script using Windows Authentication](/Examples/Resources/SqlScript/2-RunScriptUsingWindowsAuthentication.ps1) -### xSQLServerServiceAccount +### SqlServerServiceAccount Manage the service account for SQL Server services. @@ -1336,10 +1343,10 @@ Manage the service account for SQL Server services. #### Examples -* [Run service under a user account](/Examples/Resources/xSQLServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1) -* [Run service with a virtual account](/Examples/Resources/xSQLServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1) +* [Run service under a user account](/Examples/Resources/SqlServerServiceAccount/1-ConfigureServiceAccount-UserAccount.ps1) +* [Run service with a virtual account](/Examples/Resources/SqlServerServiceAccount/2-ConfigureServiceAccount-VirtualAccount.ps1) -### xSQLServerSetup +### SqlSetup Installs SQL Server on the target node. @@ -1483,15 +1490,15 @@ installing feature Database Engine and Analysis Services respectively. #### Examples -* [Install a default instance on a single server](/Examples/Resources/xSQLServerSetup/1-InstallDefaultInstanceSingleServer.ps1) -* [Install a named instance on a single server](/Examples/Resources/xSQLServerSetup/2-InstallNamedInstanceSingleServer.ps1) -* [Install a named instance on a single server from an UNC path using SourceCredential](/Examples/Resources/xSQLServerSetup/3-InstallNamedInstanceSingleServerFromUncPathUsingSourceCredential.ps1) -* [Install a named instance as the first node in SQL Server Failover Cluster](/Examples/Resources/xSQLServerSetup/4-InstallNamedInstanceInFailoverClusterFirstNode.ps1) -* [Install a named instance as the second node in SQL Server Failover Cluster](/Examples/Resources/xSQLServerSetup/5-InstallNamedInstanceInFailoverClusterSecondNode.ps1) +* [Install a default instance on a single server](/Examples/Resources/SqlSetup/1-InstallDefaultInstanceSingleServer.ps1) +* [Install a named instance on a single server](/Examples/Resources/SqlSetup/2-InstallNamedInstanceSingleServer.ps1) +* [Install a named instance on a single server from an UNC path using SourceCredential](/Examples/Resources/SqlSetup/3-InstallNamedInstanceSingleServerFromUncPathUsingSourceCredential.ps1) +* [Install a named instance as the first node in SQL Server Failover Cluster](/Examples/Resources/SqlSetup/4-InstallNamedInstanceInFailoverClusterFirstNode.ps1) +* [Install a named instance as the second node in SQL Server Failover Cluster](/Examples/Resources/SqlSetup/5-InstallNamedInstanceInFailoverClusterSecondNode.ps1) #### Known issues -All issues are not listed here, see [here for all open issues](https://github.com/PowerShell/xSQLServer/issues?q=is%3Aissue%20is%3Aopen%20xSQLServerSetup). +All issues are not listed here, see [here for all open issues](https://github.com/PowerShell/xSQLServer/issues?q=is%3Aissue%20is%3Aopen%20SqlSetup). ##### Severe known issues @@ -1499,7 +1506,7 @@ This is a list of known issues that severely impact the use of the resource. There are currently no known severe issues. -### xWaitForAvailabilityGroup +### SqlWaitForAvailabilityGroup This resource will wait for a cluster role/group to be created. This is used to wait for an Availability Group to create the cluster role/group in the cluster. @@ -1538,5 +1545,5 @@ or that it has finished creating the Availability Group. #### Examples -* [Wait for a cluster role/group to be available](/Examples/Resources/xWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1) -* [Wait for multiple cluster roles/groups to be available](/Examples/Resources/xWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1) +* [Wait for a cluster role/group to be available](/Examples/Resources/SqlWaitForAvailabilityGroup/1-WaitForASingleClusterGroup.ps1) +* [Wait for multiple cluster roles/groups to be available](/Examples/Resources/SqlWaitForAvailabilityGroup/2-WaitForMultipleClusterGroups.ps1) diff --git a/xSQLServer.psd1 b/SQLServerDSC.psd1 similarity index 100% rename from xSQLServer.psd1 rename to SQLServerDSC.psd1 diff --git a/xSQLServerHelper.psm1 b/SqlServerDSCHelper.psm1 similarity index 99% rename from xSQLServerHelper.psm1 rename to SqlServerDSCHelper.psm1 index 62e6e1d25..26ca553ec 100644 --- a/xSQLServerHelper.psm1 +++ b/SqlServerDSCHelper.psm1 @@ -3,7 +3,7 @@ Import-Module -Name (Join-Path -Path (Join-Path -Path $PSScriptRoot ` -ChildPath 'DscResources') ` -ChildPath 'CommonResourceHelper.psm1') -$script:localizedData = Get-LocalizedData -ResourceName 'xSQLServerHelper' -ScriptRoot $PSScriptRoot +$script:localizedData = Get-LocalizedData -ResourceName 'SqlServerHelper' -ScriptRoot $PSScriptRoot <# .SYNOPSIS diff --git a/Tests/Integration/MSFT_xSQLServerAlwaysOnService.Integration.Tests.ps1 b/Tests/Integration/MSFT_SqlAlwaysOnService.Integration.Tests.ps1 similarity index 98% rename from Tests/Integration/MSFT_xSQLServerAlwaysOnService.Integration.Tests.ps1 rename to Tests/Integration/MSFT_SqlAlwaysOnService.Integration.Tests.ps1 index b93a57c94..2fb4cacfb 100644 --- a/Tests/Integration/MSFT_xSQLServerAlwaysOnService.Integration.Tests.ps1 +++ b/Tests/Integration/MSFT_SqlAlwaysOnService.Integration.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceFriendlyName = 'xSQLServerAlwaysOnService' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceFriendlyName = 'SqlAlwaysOnService' $script:DSCResourceName = "MSFT_$($script:DSCResourceFriendlyName)" if (-not $env:APPVEYOR -eq $true) diff --git a/Tests/Integration/MSFT_xSQLServerAlwaysOnService.config.ps1 b/Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 similarity index 94% rename from Tests/Integration/MSFT_xSQLServerAlwaysOnService.config.ps1 rename to Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 index 973013303..1f1b75e1c 100644 --- a/Tests/Integration/MSFT_xSQLServerAlwaysOnService.config.ps1 +++ b/Tests/Integration/MSFT_SqlAlwaysOnService.config.ps1 @@ -15,7 +15,7 @@ $ConfigurationData = @{ ) } -Configuration MSFT_xSQLServerAlwaysOnService_EnableAlwaysOn_Config +Configuration MSFT_SqlAlwaysOnService_EnableAlwaysOn_Config { param ( @@ -26,7 +26,7 @@ Configuration MSFT_xSQLServerAlwaysOnService_EnableAlwaysOn_Config ) Import-DscResource -ModuleName 'PSDscResources' - Import-DscResource -ModuleName 'xSQLServer' + Import-DscResource -ModuleName 'SqlServerDSC' node localhost { WindowsFeature 'AddFeatureFailoverClustering' @@ -123,7 +123,7 @@ Configuration MSFT_xSQLServerAlwaysOnService_EnableAlwaysOn_Config } } - xSQLServerAlwaysOnService 'Integration_Test' + SqlAlwaysOnService 'Integration_Test' { Ensure = 'Present' SQLServer = $Node.ComputerName @@ -141,7 +141,7 @@ Configuration MSFT_xSQLServerAlwaysOnService_EnableAlwaysOn_Config } } -Configuration MSFT_xSQLServerAlwaysOnService_DisableAlwaysOn_Config +Configuration MSFT_SqlAlwaysOnService_DisableAlwaysOn_Config { param ( @@ -151,10 +151,10 @@ Configuration MSFT_xSQLServerAlwaysOnService_DisableAlwaysOn_Config $SqlInstallCredential ) - Import-DscResource -ModuleName 'xSQLServer' + Import-DscResource -ModuleName 'SqlServerDSC' node localhost { - xSQLServerAlwaysOnService 'Integration_Test' + SqlAlwaysOnService 'Integration_Test' { Ensure = 'Absent' SQLServer = $Node.ComputerName diff --git a/Tests/Integration/MSFT_xSQLServerDatabaseDefaultLocation.Integration.Tests.ps1 b/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.Integration.Tests.ps1 similarity index 98% rename from Tests/Integration/MSFT_xSQLServerDatabaseDefaultLocation.Integration.Tests.ps1 rename to Tests/Integration/MSFT_SqlDatabaseDefaultLocation.Integration.Tests.ps1 index 5db3676f6..d1cb37597 100644 --- a/Tests/Integration/MSFT_xSQLServerDatabaseDefaultLocation.Integration.Tests.ps1 +++ b/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.Integration.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceFriendlyName = 'xSQLServerDatabaseDefaultLocation' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceFriendlyName = 'SqlDatabaseDefaultLocation' $script:DSCResourceName = "MSFT_$($script:DSCResourceFriendlyName)" if (-not $env:APPVEYOR -eq $true) diff --git a/Tests/Integration/MSFT_xSQLServerDatabaseDefaultLocation.config.ps1 b/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 similarity index 86% rename from Tests/Integration/MSFT_xSQLServerDatabaseDefaultLocation.config.ps1 rename to Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 index 048c9b47e..bc5650b57 100644 --- a/Tests/Integration/MSFT_xSQLServerDatabaseDefaultLocation.config.ps1 +++ b/Tests/Integration/MSFT_SqlDatabaseDefaultLocation.config.ps1 @@ -19,7 +19,7 @@ $ConfigurationData = @{ ) } -Configuration MSFT_xSQLServerDatabaseDefaultLocation_Data_Config +Configuration MSFT_SqlDatabaseDefaultLocation_Data_Config { param ( @@ -30,7 +30,7 @@ Configuration MSFT_xSQLServerDatabaseDefaultLocation_Data_Config ) Import-DscResource -ModuleName 'PSDesiredStateConfiguration' - Import-DscResource -ModuleName 'xSQLServer' + Import-DscResource -ModuleName 'SqlServerDSC' node localhost { File 'SQLDataPath' @@ -42,7 +42,7 @@ Configuration MSFT_xSQLServerDatabaseDefaultLocation_Data_Config Type = 'Directory' } - xSQLServerDatabaseDefaultLocation 'Integration_Test' + SqlDatabaseDefaultLocation 'Integration_Test' { Type = 'Data' Path = $Node.DataFilePath @@ -57,7 +57,7 @@ Configuration MSFT_xSQLServerDatabaseDefaultLocation_Data_Config } } -Configuration MSFT_xSQLServerDatabaseDefaultLocation_Log_Config +Configuration MSFT_SqlDatabaseDefaultLocation_Log_Config { param ( @@ -68,7 +68,7 @@ Configuration MSFT_xSQLServerDatabaseDefaultLocation_Log_Config ) Import-DscResource -ModuleName 'PSDesiredStateConfiguration' - Import-DscResource -ModuleName 'xSQLServer' + Import-DscResource -ModuleName 'SqlServerDSC' node localhost { File 'SQLLogPath' @@ -80,7 +80,7 @@ Configuration MSFT_xSQLServerDatabaseDefaultLocation_Log_Config Type = 'Directory' } - xSQLServerDatabaseDefaultLocation 'Integration_Test' + SqlDatabaseDefaultLocation 'Integration_Test' { Type = 'Log' Path = $Node.LogFilePath @@ -95,7 +95,7 @@ Configuration MSFT_xSQLServerDatabaseDefaultLocation_Log_Config } } -Configuration MSFT_xSQLServerDatabaseDefaultLocation_Backup_Config +Configuration MSFT_SqlDatabaseDefaultLocation_Backup_Config { param ( @@ -106,7 +106,7 @@ Configuration MSFT_xSQLServerDatabaseDefaultLocation_Backup_Config ) Import-DscResource -ModuleName 'PSDesiredStateConfiguration' - Import-DscResource -ModuleName 'xSQLServer' + Import-DscResource -ModuleName 'SqlServerDSC' node localhost { File 'SQLBackupPath' @@ -118,7 +118,7 @@ Configuration MSFT_xSQLServerDatabaseDefaultLocation_Backup_Config Type = 'Directory' } - xSQLServerDatabaseDefaultLocation 'Integration_Test' + SqlDatabaseDefaultLocation 'Integration_Test' { Type = 'Backup' Path = $Node.BackupFilePath diff --git a/Tests/Integration/MSFT_xSQLServerRSConfig.Integration.Tests.ps1 b/Tests/Integration/MSFT_SqlRS.Integration.Tests.ps1 similarity index 98% rename from Tests/Integration/MSFT_xSQLServerRSConfig.Integration.Tests.ps1 rename to Tests/Integration/MSFT_SqlRS.Integration.Tests.ps1 index 9f49456c6..4be013982 100644 --- a/Tests/Integration/MSFT_xSQLServerRSConfig.Integration.Tests.ps1 +++ b/Tests/Integration/MSFT_SqlRS.Integration.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceFriendlyName = 'xSQLServerRSConfig' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceFriendlyName = 'SqlRS' $script:DSCResourceName = "MSFT_$($script:DSCResourceFriendlyName)" if (-not $env:APPVEYOR -eq $true) diff --git a/Tests/Integration/MSFT_xSQLServerRSConfig.config.ps1 b/Tests/Integration/MSFT_SqlRS.config.ps1 similarity index 93% rename from Tests/Integration/MSFT_xSQLServerRSConfig.config.ps1 rename to Tests/Integration/MSFT_SqlRS.config.ps1 index 7b65b390c..4efc2c151 100644 --- a/Tests/Integration/MSFT_xSQLServerRSConfig.config.ps1 +++ b/Tests/Integration/MSFT_SqlRS.config.ps1 @@ -30,7 +30,7 @@ $ConfigurationData = @{ ) } -Configuration MSFT_xSQLServerRSConfig_InstallReportingServices_Config +Configuration MSFT_SqlRS_InstallReportingServices_Config { param ( @@ -52,7 +52,7 @@ Configuration MSFT_xSQLServerRSConfig_InstallReportingServices_Config Import-DscResource -ModuleName 'PSDscResources' Import-DscResource -ModuleName 'xStorage' - Import-DscResource -ModuleName 'xSQLServer' + Import-DscResource -ModuleName 'SqlServerDSC' node localhost { xMountImage 'MountIsoMedia' @@ -82,7 +82,7 @@ Configuration MSFT_xSQLServerRSConfig_InstallReportingServices_Config Ensure = 'Present' } - xSQLServerSetup 'InstallReportingServicesInstance' + SqlSetup 'InstallReportingServicesInstance' { InstanceName = $Node.InstanceName Features = $Node.Features @@ -109,7 +109,7 @@ Configuration MSFT_xSQLServerRSConfig_InstallReportingServices_Config PsDscRunAsCredential = $SqlInstallCredential } - xSQLServerRSConfig 'Integration_Test' + SqlRS 'Integration_Test' { # Instance name for the Reporting Services. InstanceName = $Node.InstanceName @@ -124,7 +124,7 @@ Configuration MSFT_xSQLServerRSConfig_InstallReportingServices_Config PsDscRunAsCredential = $SqlInstallCredential DependsOn = @( - '[xSQLServerSetup]InstallReportingServicesInstance' + '[SqlSetup]InstallReportingServicesInstance' ) } } diff --git a/Tests/Integration/MSFT_xSQLServerSetup.Integration.Tests.ps1 b/Tests/Integration/MSFT_SqlSetup.Integration.Tests.ps1 similarity index 99% rename from Tests/Integration/MSFT_xSQLServerSetup.Integration.Tests.ps1 rename to Tests/Integration/MSFT_SqlSetup.Integration.Tests.ps1 index d3d11d27c..9855151bb 100644 --- a/Tests/Integration/MSFT_xSQLServerSetup.Integration.Tests.ps1 +++ b/Tests/Integration/MSFT_SqlSetup.Integration.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceFriendlyName = 'xSQLServerSetup' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceFriendlyName = 'SqlSetup' $script:DSCResourceName = "MSFT_$($script:DSCResourceFriendlyName)" if (-not $env:APPVEYOR -eq $true) diff --git a/Tests/Integration/MSFT_xSQLServerSetup.config.ps1 b/Tests/Integration/MSFT_SqlSetup.config.ps1 similarity index 95% rename from Tests/Integration/MSFT_xSQLServerSetup.config.ps1 rename to Tests/Integration/MSFT_SqlSetup.config.ps1 index 2279a8d89..6147bdaa1 100644 --- a/Tests/Integration/MSFT_xSQLServerSetup.config.ps1 +++ b/Tests/Integration/MSFT_SqlSetup.config.ps1 @@ -28,7 +28,7 @@ $ConfigurationData = @{ ) } -Configuration MSFT_xSQLServerSetup_InstallSqlEngineAsSystem_Config +Configuration MSFT_SqlSetup_InstallSqlEngineAsSystem_Config { param ( @@ -55,7 +55,7 @@ Configuration MSFT_xSQLServerSetup_InstallSqlEngineAsSystem_Config Import-DscResource -ModuleName 'PSDscResources' Import-DscResource -ModuleName 'xStorage' - Import-DscResource -ModuleName 'xSQLServer' + Import-DscResource -ModuleName 'SqlServerDSC' node localhost { xMountImage 'MountIsoMedia' @@ -113,7 +113,7 @@ Configuration MSFT_xSQLServerSetup_InstallSqlEngineAsSystem_Config Ensure = 'Present' } - xSQLServerSetup 'Integration_Test' + SqlSetup 'Integration_Test' { InstanceName = $Node.InstanceName Features = $Node.Features @@ -134,7 +134,7 @@ Configuration MSFT_xSQLServerSetup_InstallSqlEngineAsSystem_Config $SqlAdministratorCredential.UserName <# Must have permission to properties IsClustered and - IsHadrEnable for xSQLServerAlwaysOnService. + IsHadrEnable for SqlAlwaysOnService. #> $SqlInstallCredential.UserName ) diff --git a/Tests/xSQLServerCommon.Tests.ps1 b/Tests/SqlServerDSCCommon.Tests.ps1 similarity index 94% rename from Tests/xSQLServerCommon.Tests.ps1 rename to Tests/SqlServerDSCCommon.Tests.ps1 index 618dcd463..366949946 100644 --- a/Tests/xSQLServerCommon.Tests.ps1 +++ b/Tests/SqlServerDSCCommon.Tests.ps1 @@ -5,7 +5,7 @@ param() $script:moduleRoot = Split-Path $PSScriptRoot -Parent -Describe 'xSQLServer module common tests' { +Describe 'SqlServerDSC module common tests' { Context -Name 'When there are example file for resource' { <# For Appveyor builds copy the module to the system modules directory so it falls @@ -13,7 +13,7 @@ Describe 'xSQLServer module common tests' { #> if ($env:APPVEYOR) { - $powershellModulePath = Join-Path -Path (($env:PSModulePath -split ';')[0]) -ChildPath 'xSQLServer' + $powershellModulePath = Join-Path -Path (($env:PSModulePath -split ';')[0]) -ChildPath 'SqlServerDSC' Copy-item -Path $env:APPVEYOR_BUILD_FOLDER -Destination $powershellModulePath -Recurse -Force } @@ -69,7 +69,7 @@ Describe 'xSQLServer module common tests' { Remove-item -Path $powershellModulePath -Recurse -Force -Confirm:$false # Restore the module in 'memory' to ensure other tests after this test have access to it - Import-Module -Name "$script:moduleRoot\xSQLServer.psd1" -Global -Force + Import-Module -Name "$script:moduleRoot\SqlServerDSC.psd1" -Global -Force } } } diff --git a/Tests/Unit/MSFT_xSQLServerAlwaysOnAvailabilityGroup.Tests.ps1 b/Tests/Unit/MSFT_SqlAG.Tests.ps1 similarity index 99% rename from Tests/Unit/MSFT_xSQLServerAlwaysOnAvailabilityGroup.Tests.ps1 rename to Tests/Unit/MSFT_SqlAG.Tests.ps1 index 0a0409bca..763f1a465 100644 --- a/Tests/Unit/MSFT_xSQLServerAlwaysOnAvailabilityGroup.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAG.Tests.ps1 @@ -12,8 +12,8 @@ Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -P Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'Tests' -ChildPath (Join-Path -Path 'TestHelpers' -ChildPath 'CommonTestHelper.psm1'))) -Force -Global $TestEnvironment = Initialize-TestEnvironment ` - -DSCModuleName 'xSQLServer' ` - -DSCResourceName 'MSFT_xSQLServerAlwaysOnAvailabilityGroup' ` + -DSCModuleName 'SqlServerDSC' ` + -DSCResourceName 'MSFT_SqlAG' ` -TestType Unit #endregion HEADER @@ -35,7 +35,7 @@ try { Invoke-TestSetup - InModuleScope 'MSFT_xSQLServerAlwaysOnAvailabilityGroup' { + InModuleScope 'MSFT_SqlAG' { #region parameter mocks @@ -681,7 +681,7 @@ try #endregion cmdlet mocks - Describe 'xSQLServerAlwaysOnAvailabilityGroup\Get-TargetResource' -Tag 'Get' { + Describe 'SqlAG\Get-TargetResource' -Tag 'Get' { BeforeAll { Mock -CommandName Connect-SQL -MockWith $mockConnectSql -Verifiable } @@ -770,7 +770,7 @@ try } } - Describe 'xSQLServerAlwaysOnAvailabilityGroup\Set-TargetResource' -Tag 'Set' { + Describe 'SqlAG\Set-TargetResource' -Tag 'Set' { BeforeAll { Mock -CommandName Connect-SQL -MockWith $mockConnectSql -Verifiable Mock -CommandName Get-PrimaryReplicaServerObject -MockWith $mockConnectSql -Verifiable @@ -1205,7 +1205,7 @@ try } } - Describe 'xSQLServerAlwaysOnAvailabilityGroup\Test-TargetResource' -Tag 'Test' { + Describe 'SqlAG\Test-TargetResource' -Tag 'Test' { BeforeAll { Mock -CommandName Connect-SQL -MockWith $mockConnectSql -Verifiable Mock -CommandName Test-ActiveNode -MockWith { @@ -1389,7 +1389,7 @@ try } } - Describe 'xSQLServerAlwaysOnAvailabilityGroup\Update-AvailabilityGroup' -Tag 'Helper' { + Describe 'SqlAG\Update-AvailabilityGroup' -Tag 'Helper' { BeforeAll { Mock -CommandName New-TerminatingError -MockWith { $ErrorType diff --git a/Tests/Unit/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.Tests.ps1 b/Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 similarity index 99% rename from Tests/Unit/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.Tests.ps1 rename to Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 index 95e108627..50d21d59e 100644 --- a/Tests/Unit/MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAGDatabases.Tests.ps1 @@ -9,15 +9,15 @@ if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCR } Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force -Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent | Split-Path -Parent) -ChildPath 'xSQLServerHelper.psm1') -Scope Global -Force +Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent | Split-Path -Parent) -ChildPath 'SqlServerDSCHelper.psm1') -Scope Global -Force Import-Module -Name ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stubs ) -ChildPath SQLPSStub.psm1 ) -Force -Global # Loading mocked classes Add-Type -Path ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stubs ) -ChildPath SMO.cs ) $TestEnvironment = Initialize-TestEnvironment ` - -DSCModuleName 'xSQLServer' ` - -DSCResourceName 'MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership' ` + -DSCModuleName 'SqlServerDSC' ` + -DSCResourceName 'MSFT_SqlAGDatabases' ` -TestType Unit #endregion HEADER @@ -37,7 +37,7 @@ try { Invoke-TestSetup - InModuleScope 'MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership' { + InModuleScope 'MSFT_SqlAGDatabases' { #region Parameter Mocks @@ -354,7 +354,7 @@ WITH NORECOVERY' #endregion Invoke Query Mock - Describe 'xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership\Get-TargetResource' { + Describe 'SqlAGDatabases\Get-TargetResource' { BeforeAll { Mock -CommandName Connect-SQL -MockWith { return $mockServerObject } -Verifiable Mock -CommandName Import-SQLPSModule -MockWith {} -Verifiable @@ -422,7 +422,7 @@ WITH NORECOVERY' } } - Describe 'xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership\Set-TargetResource' { + Describe 'SqlAGDatabases\Set-TargetResource' { BeforeAll { Mock -CommandName Get-PrimaryReplicaServerObject -MockWith { return $mockServerObject } -Verifiable -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } Mock -CommandName Get-PrimaryReplicaServerObject -MockWith { return $mockServer2Object } -Verifiable -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server2' } @@ -1137,7 +1137,7 @@ WITH NORECOVERY' } } - Describe 'xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership\Test-TargetResource' { + Describe 'SqlAGDatabases\Test-TargetResource' { BeforeAll { Mock -CommandName Connect-SQL -MockWith { return $mockServerObject } -Verifiable Mock -CommandName Get-PrimaryReplicaServerObject -MockWith { return $mockServerObject } -Verifiable -ParameterFilter { $AvailabilityGroup.PrimaryReplicaServerName -eq 'Server1' } @@ -1331,7 +1331,7 @@ WITH NORECOVERY' } } - Describe 'xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership\Get-DatabasesToAddToAvailabilityGroup' { + Describe 'SqlAGDatabases\Get-DatabasesToAddToAvailabilityGroup' { BeforeEach { $getDatabasesToAddToAvailabilityGroup = @{ DatabaseName = $mockDatabaseNameParameter.Clone() @@ -1370,7 +1370,7 @@ WITH NORECOVERY' } } - Describe 'xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership\Get-DatabasesToRemoveFromAvailabilityGroup' { + Describe 'SqlAGDatabases\Get-DatabasesToRemoveFromAvailabilityGroup' { BeforeEach { $getDatabasesToRemoveFromAvailabilityGroupParameters = @{ DatabaseName = $mockDatabaseNameParameter.Clone() @@ -1447,7 +1447,7 @@ WITH NORECOVERY' } } - Describe 'xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership\Get-MatchingDatabaseNames' { + Describe 'SqlAGDatabases\Get-MatchingDatabaseNames' { BeforeEach { $getMatchingDatabaseNamesParameters = @{ DatabaseName = $mockDatabaseNameParameter.Clone() @@ -1479,7 +1479,7 @@ WITH NORECOVERY' } } - Describe 'xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership\Get-DatabaseNamesNotFoundOnTheInstance' { + Describe 'SqlAGDatabases\Get-DatabaseNamesNotFoundOnTheInstance' { Context 'When the Get-DatabaseNamesNotFoundOnTheInstance function is called' { BeforeAll { # The defined databases that should be identified as missing diff --git a/Tests/Unit/MSFT_xSQLServerAvailabilityGroupListener.Tests.ps1 b/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 similarity index 99% rename from Tests/Unit/MSFT_xSQLServerAvailabilityGroupListener.Tests.ps1 rename to Tests/Unit/MSFT_SqlAGListener.Tests.ps1 index d3ec63a44..83f0a2ed2 100644 --- a/Tests/Unit/MSFT_xSQLServerAvailabilityGroupListener.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAGListener.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerAvailabilityGroupListener' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlServerDSCAvailabilityGroupListener' #region HEADER @@ -93,7 +93,7 @@ try #endregion Pester Test Initialization - Describe 'xSQLServerAvailabilityGroupListener\Get-TargetResource' { + Describe 'SqlServerDSCAvailabilityGroupListener\Get-TargetResource' { BeforeEach { $testParameters = $defaultParameters.Clone() @@ -224,7 +224,7 @@ try Assert-VerifiableMock } - Describe 'xSQLServerAvailabilityGroupListener\Test-TargetResource' { + Describe 'SqlServerDSCAvailabilityGroupListener\Test-TargetResource' { BeforeEach { $testParameters = $defaultParameters.Clone() } @@ -509,7 +509,7 @@ try Assert-VerifiableMock } - Describe 'xSQLServerAvailabilityGroupListener\Set-TargetResource' { + Describe 'SqlServerDSCAvailabilityGroupListener\Set-TargetResource' { BeforeEach { $testParameters = $defaultParameters.Clone() diff --git a/Tests/Unit/MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica.Tests.ps1 b/Tests/Unit/MSFT_SqlAGReplica.Tests.ps1 similarity index 99% rename from Tests/Unit/MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica.Tests.ps1 rename to Tests/Unit/MSFT_SqlAGReplica.Tests.ps1 index 24a24b8a4..5726f1bbf 100644 --- a/Tests/Unit/MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAGReplica.Tests.ps1 @@ -13,8 +13,8 @@ Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -P Add-Type -Path ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stubs ) -ChildPath SMO.cs ) $TestEnvironment = Initialize-TestEnvironment ` - -DSCModuleName 'xSQLServer' ` - -DSCResourceName 'MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica' ` + -DSCModuleName 'SqlServerDSC' ` + -DSCResourceName 'MSFT_SqlAGReplica' ` -TestType Unit #endregion HEADER @@ -33,7 +33,7 @@ try { Invoke-TestSetup - InModuleScope 'MSFT_xSQLServerAlwaysOnAvailabilityGroupReplica' { + InModuleScope 'MSFT_SqlAGReplica' { #region parameter mocks @@ -530,7 +530,7 @@ try #endregion - Describe 'xSQLServerAlwaysOnAvailabilityGroupReplica\Get-TargetResource' { + Describe 'SqlAGReplica\Get-TargetResource' { BeforeEach { $getTargetResourceParameters = @{ Name = $mockAvailabilityGroupReplicaName @@ -602,7 +602,7 @@ try } } - Describe 'xSQLServerAlwaysOnAvailabilityGroupReplica\Set-TargetResource' { + Describe 'SqlAGReplica\Set-TargetResource' { BeforeAll { Mock -CommandName Import-SQLPSModule -MockWith {} -Verifiable @@ -1266,7 +1266,7 @@ try } } - Describe 'xSQLServerAlwaysOnAvailabilityGroupReplica\Test-TargetResource' { + Describe 'SqlAGReplica\Test-TargetResource' { BeforeEach { $mockAlternateEndpointPort = $false diff --git a/Tests/Unit/MSFT_xSQLServerAlias.Tests.ps1 b/Tests/Unit/MSFT_SqlAlias.Tests.ps1 similarity index 99% rename from Tests/Unit/MSFT_xSQLServerAlias.Tests.ps1 rename to Tests/Unit/MSFT_SqlAlias.Tests.ps1 index ff796b22c..eb79a65c1 100644 --- a/Tests/Unit/MSFT_xSQLServerAlias.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAlias.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerAlias' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlAlias' #region HEADER diff --git a/Tests/Unit/MSFT_xSQLServerAlwaysOnService.Tests.ps1 b/Tests/Unit/MSFT_SqlAlwaysOnService.Tests.ps1 similarity index 99% rename from Tests/Unit/MSFT_xSQLServerAlwaysOnService.Tests.ps1 rename to Tests/Unit/MSFT_SqlAlwaysOnService.Tests.ps1 index 59547d7b0..a4b7afab0 100644 --- a/Tests/Unit/MSFT_xSQLServerAlwaysOnService.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlAlwaysOnService.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerAlwaysOnService' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlAlwaysOnService' # Unit Test Template Version: 1.1.0 [String] $script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) diff --git a/Tests/Unit/MSFT_xSQLServerDatabase.Tests.ps1 b/Tests/Unit/MSFT_SqlDatabase.Tests.ps1 similarity index 98% rename from Tests/Unit/MSFT_xSQLServerDatabase.Tests.ps1 rename to Tests/Unit/MSFT_SqlDatabase.Tests.ps1 index 5a1ae80ed..7469fc30d 100644 --- a/Tests/Unit/MSFT_xSQLServerDatabase.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlDatabase.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerDatabase' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlDatabase' #region HEADER @@ -125,7 +125,7 @@ try } #endregion - Describe "MSFT_xSQLServerDatabase\Get-TargetResource" -Tag 'Get'{ + Describe "MSFT_SqlDatabase\Get-TargetResource" -Tag 'Get'{ BeforeEach { Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable } @@ -185,7 +185,7 @@ try Assert-VerifiableMock } - Describe "MSFT_xSQLServerDatabase\Test-TargetResource" -Tag 'Test'{ + Describe "MSFT_SqlDatabase\Test-TargetResource" -Tag 'Test'{ BeforeEach { Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable } @@ -287,7 +287,7 @@ try Assert-VerifiableMock } - Describe "MSFT_xSQLServerDatabase\Set-TargetResource" -Tag 'Set'{ + Describe "MSFT_SqlDatabase\Set-TargetResource" -Tag 'Set'{ BeforeEach { Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable Mock -CommandName New-Object -MockWith $mockNewObjectDatabase -ParameterFilter { diff --git a/Tests/Unit/MSFT_xSQLServerDatabaseDefaultLocation.Tests.ps1 b/Tests/Unit/MSFT_SqlDatabaseDefaultLocation.Tests.ps1 similarity index 96% rename from Tests/Unit/MSFT_xSQLServerDatabaseDefaultLocation.Tests.ps1 rename to Tests/Unit/MSFT_SqlDatabaseDefaultLocation.Tests.ps1 index 9b79817a8..dd6cff12b 100644 --- a/Tests/Unit/MSFT_xSQLServerDatabaseDefaultLocation.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlDatabaseDefaultLocation.Tests.ps1 @@ -13,8 +13,8 @@ Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -P Add-Type -Path ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stubs ) -ChildPath SMO.cs ) $TestEnvironment = Initialize-TestEnvironment ` - -DSCModuleName 'xSQLServer' ` - -DSCResourceName 'MSFT_xSQLServerDatabaseDefaultLocation' ` + -DSCModuleName 'SqlServerDSC' ` + -DSCResourceName 'MSFT_SqlDatabaseDefaultLocation' ` -TestType Unit #endregion HEADER @@ -31,7 +31,7 @@ try { Invoke-TestSetup - InModuleScope 'MSFT_xSQLServerDatabaseDefaultLocation' { + InModuleScope 'MSFT_SqlDatabaseDefaultLocation' { $mockSqlServerName = 'localhost' $mockSqlServerInstanceName = 'MSSQLSERVER' $mockSQLDataPath = 'C:\Program Files\Data\' @@ -101,7 +101,7 @@ try ) #endregion - Describe 'MSFT_xSQLServerDatabaseDefaultLocation\Get-TargetResource' -Tag 'Get'{ + Describe 'MSFT_SqlDatabaseDefaultLocation\Get-TargetResource' -Tag 'Get'{ BeforeEach { Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable Mock -CommandName Test-ActiveNode -Mockwith { @@ -135,7 +135,7 @@ try } } - Describe 'MSFT_xSQLServerDatabaseDefaultLocation\Test-TargetResource' -Tag 'Test'{ + Describe 'MSFT_SqlDatabaseDefaultLocation\Test-TargetResource' -Tag 'Test'{ BeforeEach { Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable Mock -CommandName Test-ActiveNode -MockWith { @@ -213,7 +213,7 @@ try } } - Describe 'MSFT_xSQLServerDatabaseDefaultLocation\Set-TargetResource' -Tag 'Set'{ + Describe 'MSFT_SqlDatabaseDefaultLocation\Set-TargetResource' -Tag 'Set'{ BeforeEach { Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable Mock -CommandName Restart-SqlService -Verifiable diff --git a/Tests/Unit/MSFT_xSQLServerDatabaseOwner.Tests.ps1 b/Tests/Unit/MSFT_SqlDatabaseOwner.Tests.ps1 similarity index 95% rename from Tests/Unit/MSFT_xSQLServerDatabaseOwner.Tests.ps1 rename to Tests/Unit/MSFT_SqlDatabaseOwner.Tests.ps1 index ee95cb492..96295181c 100644 --- a/Tests/Unit/MSFT_xSQLServerDatabaseOwner.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlDatabaseOwner.Tests.ps1 @@ -1,303 +1,303 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerDatabaseOwner' - -#region HEADER - -# Unit Test Template Version: 1.2.0 -$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) -if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` - (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) -{ - & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) -} - -Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force - -$TestEnvironment = Initialize-TestEnvironment ` - -DSCModuleName $script:DSCModuleName ` - -DSCResourceName $script:DSCResourceName ` - -TestType Unit - -#endregion HEADER - -function Invoke-TestSetup { -} - -function Invoke-TestCleanup { - Restore-TestEnvironment -TestEnvironment $TestEnvironment -} - -# Begin Testing -try -{ - Invoke-TestSetup - - InModuleScope $script:DSCResourceName { - $mockSqlServerName = 'localhost' - $mockSqlServerInstanceName = 'MSSQLSERVER' - $mockSqlDatabaseName = 'AdventureWorks' - $mockSqlServerLogin = 'Zebes\SamusAran' - $mockSqlServerLoginType = 'WindowsUser' - $mockDatabaseOwner = 'Elysia\Chozo' - $mockInvalidOperationForSetOwnerMethod = $false - $mockExpectedDatabaseOwner = 'Elysia\Chozo' - - # Default parameters that are used for the It-blocks - $mockDefaultParameters = @{ - SQLInstanceName = $mockSqlServerInstanceName - SQLServer = $mockSqlServerName - } - - #region Function mocks - $mockConnectSQL = { - return @( - ( - New-Object Object | - Add-Member -MemberType NoteProperty -Name InstanceName -Value $mockSqlServerInstanceName -PassThru | - Add-Member -MemberType NoteProperty -Name ComputerNamePhysicalNetBIOS -Value $mockSqlServerName -PassThru | - Add-Member -MemberType ScriptProperty -Name Databases -Value { - return @{ - $mockSqlDatabaseName = @(( - New-Object Object | - Add-Member -MemberType NoteProperty -Name Name -Value $mockSqlDatabaseName -PassThru | - Add-Member -MemberType NoteProperty -Name Owner -Value $mockDatabaseOwner -PassThru | - Add-Member -MemberType ScriptMethod -Name SetOwner -Value { - if ($mockInvalidOperationForSetOwnerMethod) - { - throw 'Mock of method SetOwner() was called with invalid operation.' - } - - if ( $this.Owner -ne $mockExpectedDatabaseOwner ) - { - throw "Called mocked SetOwner() method without setting the right login. Expected '{0}'. But was '{1}'." ` - -f $mockExpectedDatabaseOwner, $this.Owner - } - } -PassThru -Force - )) - } - } -PassThru -Force | - Add-Member -MemberType ScriptProperty -Name Logins -Value { - return @{ - $mockSqlServerLogin = @(( - New-Object Object | - Add-Member -MemberType NoteProperty -Name LoginType -Value $mockSqlServerLoginType -PassThru - )) - } - } -PassThru -Force - ) - ) - } - #endregion - - Describe "MSFT_xSQLServerDatabaseOwner\Get-TargetResource" -Tag 'Get'{ - BeforeEach { - Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable - } - - Context 'When passing values to parameters and database name does not exist' { - It 'Should throw the correct error' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = 'unknownDatabaseName' - Name = $mockSqlServerLogin - } - - $throwInvalidOperation = ("Database 'unknownDatabaseName' does not exist " + ` - "on SQL server 'localhost\MSSQLSERVER'.") - - { Get-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - } - - Context 'When the system is either in the desired state or not in the desired state' { - It 'Should not throw' { - $testParameters = $defaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - } - - $result = Get-TargetResource @testParameters - } - - It 'Should return the name of the owner from the get method' { - $result.Name | Should -Be $testParameters.Name - } - - It 'Should return the same values as passed as parameters' { - $result.SQLServer | Should -Be $testParameters.SQLServer - $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName - $result.Database | Should -Be $testParameters.Database - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - } - - Assert-VerifiableMock - } - - Describe "MSFT_xSQLServerDatabaseOwner\Test-TargetResource" -Tag 'Test'{ - BeforeEach { - Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable - } - - Context 'When the system is not in the desired state' { - It 'Should return the state as false when desired login is not the database owner' { - $testParameters = $defaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - } - - $result = Test-TargetResource @testParameters - $result | Should -Be $false - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - } - - Context 'When the system is in the desired state' { - It 'Should return the state as true when desired login is the database owner' { - $mockDatabaseOwner = 'Zebes\SamusAran' - $mockSqlServerLogin = 'Zebes\SamusAran' - $testParameters = $defaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - } - - $result = Test-TargetResource @testParameters - $result | Should -Be $true - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - } - - Assert-VerifiableMock - } - - Describe "MSFT_xSQLServerDatabaseOwner\Set-TargetResource" -Tag 'Set'{ - BeforeEach { - Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable - } - - Context 'When the system is not in the desired state and database name does not exist' { - It 'Should throw the correct error' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = 'unknownDatabaseName' - Name = $mockSqlServerLogin - } - - $throwInvalidOperation = ("Database 'unknownDatabaseName' does not exist " + ` - "on SQL server 'localhost\MSSQLSERVER'.") - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - } - - Context 'When the system is not in the desired state and login name does not exist' { - It 'Should throw the correct error' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = 'John' - } - - $throwInvalidOperation = ("Login 'John' does not exist on " + ` - "SQL server 'localhost\MSSQLSERVER'.") - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - } - - Context 'When the system is not in the desired state' { - It 'Should not throw' { - $mockExpectedDatabaseOwner = $mockSqlServerLogin - $mockDatabaseOwner = $mockSqlServerLogin - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - } - - { Set-TargetResource @testParameters } | Should -Not -Throw - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - } - - Context 'When the system is not in the desired state' { - It 'Should throw the correct error when the method SetOwner() set the wrong login' { - $mockExpectedDatabaseOwner = $mockSqlServerLogin - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - } - - $throwInvalidOperation = ('Failed to set owner named Zebes\SamusAran of the database ' + ` - 'named AdventureWorks on localhost\MSSQLSERVER. InnerException: ' + ` - 'Exception calling "SetOwner" with "1" argument(s): "Called mocked ' + ` - 'SetOwner() method without setting the right login. ' + ` - "Expected 'Zebes\SamusAran'. But was 'Elysia\Chozo'.") - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - } - - Context 'When the system is not in the desired state' { - It 'Should throw the correct error when the method SetOwner() was called' { - $mockInvalidOperationForSetOwnerMethod = $true - $mockExpectedDatabaseOwner = $mockSqlServerLogin - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - } - - $throwInvalidOperation = ('Failed to set owner named Zebes\SamusAran of the database ' + ` - 'named AdventureWorks on localhost\MSSQLSERVER. InnerException: ' + ` - 'Exception calling "SetOwner" with "1" argument(s): "Mock ' + ` - 'of method SetOwner() was called with invalid operation.') - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - } - - Assert-VerifiableMock - } - } -} -finally -{ - Invoke-TestCleanup -} +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlDatabaseOwner' + +#region HEADER + +# Unit Test Template Version: 1.2.0 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) +} + +Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $script:DSCModuleName ` + -DSCResourceName $script:DSCResourceName ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup { +} + +function Invoke-TestCleanup { + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope $script:DSCResourceName { + $mockSqlServerName = 'localhost' + $mockSqlServerInstanceName = 'MSSQLSERVER' + $mockSqlDatabaseName = 'AdventureWorks' + $mockSqlServerLogin = 'Zebes\SamusAran' + $mockSqlServerLoginType = 'WindowsUser' + $mockDatabaseOwner = 'Elysia\Chozo' + $mockInvalidOperationForSetOwnerMethod = $false + $mockExpectedDatabaseOwner = 'Elysia\Chozo' + + # Default parameters that are used for the It-blocks + $mockDefaultParameters = @{ + SQLInstanceName = $mockSqlServerInstanceName + SQLServer = $mockSqlServerName + } + + #region Function mocks + $mockConnectSQL = { + return @( + ( + New-Object Object | + Add-Member -MemberType NoteProperty -Name InstanceName -Value $mockSqlServerInstanceName -PassThru | + Add-Member -MemberType NoteProperty -Name ComputerNamePhysicalNetBIOS -Value $mockSqlServerName -PassThru | + Add-Member -MemberType ScriptProperty -Name Databases -Value { + return @{ + $mockSqlDatabaseName = @(( + New-Object Object | + Add-Member -MemberType NoteProperty -Name Name -Value $mockSqlDatabaseName -PassThru | + Add-Member -MemberType NoteProperty -Name Owner -Value $mockDatabaseOwner -PassThru | + Add-Member -MemberType ScriptMethod -Name SetOwner -Value { + if ($mockInvalidOperationForSetOwnerMethod) + { + throw 'Mock of method SetOwner() was called with invalid operation.' + } + + if ( $this.Owner -ne $mockExpectedDatabaseOwner ) + { + throw "Called mocked SetOwner() method without setting the right login. Expected '{0}'. But was '{1}'." ` + -f $mockExpectedDatabaseOwner, $this.Owner + } + } -PassThru -Force + )) + } + } -PassThru -Force | + Add-Member -MemberType ScriptProperty -Name Logins -Value { + return @{ + $mockSqlServerLogin = @(( + New-Object Object | + Add-Member -MemberType NoteProperty -Name LoginType -Value $mockSqlServerLoginType -PassThru + )) + } + } -PassThru -Force + ) + ) + } + #endregion + + Describe "MSFT_SqlDatabaseOwner\Get-TargetResource" -Tag 'Get'{ + BeforeEach { + Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable + } + + Context 'When passing values to parameters and database name does not exist' { + It 'Should throw the correct error' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = 'unknownDatabaseName' + Name = $mockSqlServerLogin + } + + $throwInvalidOperation = ("Database 'unknownDatabaseName' does not exist " + ` + "on SQL server 'localhost\MSSQLSERVER'.") + + { Get-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + } + + Context 'When the system is either in the desired state or not in the desired state' { + It 'Should not throw' { + $testParameters = $defaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + } + + $result = Get-TargetResource @testParameters + } + + It 'Should return the name of the owner from the get method' { + $result.Name | Should -Be $testParameters.Name + } + + It 'Should return the same values as passed as parameters' { + $result.SQLServer | Should -Be $testParameters.SQLServer + $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName + $result.Database | Should -Be $testParameters.Database + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + } + + Assert-VerifiableMock + } + + Describe "MSFT_SqlDatabaseOwner\Test-TargetResource" -Tag 'Test'{ + BeforeEach { + Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable + } + + Context 'When the system is not in the desired state' { + It 'Should return the state as false when desired login is not the database owner' { + $testParameters = $defaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + } + + $result = Test-TargetResource @testParameters + $result | Should -Be $false + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + } + + Context 'When the system is in the desired state' { + It 'Should return the state as true when desired login is the database owner' { + $mockDatabaseOwner = 'Zebes\SamusAran' + $mockSqlServerLogin = 'Zebes\SamusAran' + $testParameters = $defaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + } + + $result = Test-TargetResource @testParameters + $result | Should -Be $true + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + } + + Assert-VerifiableMock + } + + Describe "MSFT_SqlDatabaseOwner\Set-TargetResource" -Tag 'Set'{ + BeforeEach { + Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable + } + + Context 'When the system is not in the desired state and database name does not exist' { + It 'Should throw the correct error' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = 'unknownDatabaseName' + Name = $mockSqlServerLogin + } + + $throwInvalidOperation = ("Database 'unknownDatabaseName' does not exist " + ` + "on SQL server 'localhost\MSSQLSERVER'.") + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + } + + Context 'When the system is not in the desired state and login name does not exist' { + It 'Should throw the correct error' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = 'John' + } + + $throwInvalidOperation = ("Login 'John' does not exist on " + ` + "SQL server 'localhost\MSSQLSERVER'.") + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + } + + Context 'When the system is not in the desired state' { + It 'Should not throw' { + $mockExpectedDatabaseOwner = $mockSqlServerLogin + $mockDatabaseOwner = $mockSqlServerLogin + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + } + + { Set-TargetResource @testParameters } | Should -Not -Throw + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + } + + Context 'When the system is not in the desired state' { + It 'Should throw the correct error when the method SetOwner() set the wrong login' { + $mockExpectedDatabaseOwner = $mockSqlServerLogin + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + } + + $throwInvalidOperation = ('Failed to set owner named Zebes\SamusAran of the database ' + ` + 'named AdventureWorks on localhost\MSSQLSERVER. InnerException: ' + ` + 'Exception calling "SetOwner" with "1" argument(s): "Called mocked ' + ` + 'SetOwner() method without setting the right login. ' + ` + "Expected 'Zebes\SamusAran'. But was 'Elysia\Chozo'.") + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + } + + Context 'When the system is not in the desired state' { + It 'Should throw the correct error when the method SetOwner() was called' { + $mockInvalidOperationForSetOwnerMethod = $true + $mockExpectedDatabaseOwner = $mockSqlServerLogin + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + } + + $throwInvalidOperation = ('Failed to set owner named Zebes\SamusAran of the database ' + ` + 'named AdventureWorks on localhost\MSSQLSERVER. InnerException: ' + ` + 'Exception calling "SetOwner" with "1" argument(s): "Mock ' + ` + 'of method SetOwner() was called with invalid operation.') + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + } + + Assert-VerifiableMock + } + } +} +finally +{ + Invoke-TestCleanup +} diff --git a/Tests/Unit/MSFT_xSQLServerDatabasePermission.Tests.ps1 b/Tests/Unit/MSFT_SqlDatabasePermission.Tests.ps1 similarity index 97% rename from Tests/Unit/MSFT_xSQLServerDatabasePermission.Tests.ps1 rename to Tests/Unit/MSFT_SqlDatabasePermission.Tests.ps1 index 5e8ca8aa9..7d48a84c7 100644 --- a/Tests/Unit/MSFT_xSQLServerDatabasePermission.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlDatabasePermission.Tests.ps1 @@ -1,860 +1,860 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerDatabasePermission' - -#region HEADER - -# Unit Test Template Version: 1.2.0 -$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) -if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` - (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) -{ - & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) -} - -Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force - -$TestEnvironment = Initialize-TestEnvironment ` - -DSCModuleName $script:DSCModuleName ` - -DSCResourceName $script:DSCResourceName ` - -TestType Unit - -#endregion HEADER - -function Invoke-TestSetup { - # Loading mocked classes - Add-Type -Path (Join-Path -Path $script:moduleRoot -ChildPath 'Tests\Unit\Stubs\SMO.cs') -} - -function Invoke-TestCleanup { - Restore-TestEnvironment -TestEnvironment $TestEnvironment -} - -# Begin Testing -try -{ - Invoke-TestSetup - - InModuleScope $script:DSCResourceName { - $mockSqlServerName = 'localhost' - $mockSqlServerInstanceName = 'MSSQLSERVER' - $mockSqlDatabaseName = 'AdventureWorks' - $mockSqlServerLogin = 'Zebes\SamusAran' - $mockSqlServerLoginUnknown = 'Elysia\Chozo' - $mockLoginType = 'WindowsUser' - $mockInvalidOperationEnumDatabasePermissions = $false - $mockInvalidOperationForCreateMethod = $false - $mockExpectedSqlServerLogin = 'Zebes\SamusAran' - $mockSqlPermissionState = 'Grant' - - $mockSqlPermissionType01 = New-Object -TypeName Microsoft.SqlServer.Management.Smo.DatabasePermissionSet -ArgumentList ($true, $false) - $mockSqlPermissionType02 = New-Object -TypeName Microsoft.SqlServer.Management.Smo.DatabasePermissionSet -ArgumentList ($false, $true) - - $script:mockMethodGrantRan = $false - $script:mockMethodDenyRan = $false - $script:mockMethodRevokeRan = $false - $script:mockMethodCreateLoginRan = $false - - # Default parameters that are used for the It-blocks - $mockDefaultParameters = @{ - SQLInstanceName = $mockSqlServerInstanceName - SQLServer = $mockSqlServerName - } - - #region Function mocks - $mockConnectSQL = { - return @( - ( - New-Object Object | - Add-Member -MemberType NoteProperty -Name InstanceName -Value $mockSqlServerInstanceName -PassThru | - Add-Member -MemberType NoteProperty -Name ComputerNamePhysicalNetBIOS -Value $mockSqlServerName -PassThru | - Add-Member -MemberType ScriptProperty -Name Databases -Value { - return @{ - $mockSqlDatabaseName = @(( - New-Object Object | - Add-Member -MemberType NoteProperty -Name Name -Value $mockSqlDatabaseName -PassThru | - Add-Member -MemberType ScriptProperty -Name Users -Value { - return @{ - $mockSqlServerLogin = @(( - New-Object Object | - Add-Member -MemberType ScriptMethod -Name IsMember -Value { - return $true - } -PassThru - )) - } - } -PassThru | - Add-Member -MemberType ScriptMethod -Name EnumDatabasePermissions -Value { - param - ( - [Parameter()] - [System.String] - $SqlServerLogin - ) - if ($mockInvalidOperationEnumDatabasePermissions) - { - throw 'Mock EnumDatabasePermissions Method was called with invalid operation.' - } - - if ( $SqlServerLogin -eq $mockExpectedSqlServerLogin ) - { - $mockEnumDatabasePermissions = @() - $mockEnumDatabasePermissions += New-Object Object | - Add-Member -MemberType NoteProperty -Name PermissionType -Value $mockSqlPermissionType01 -PassThru | - Add-Member -MemberType NoteProperty -Name PermissionState -Value $mockSqlPermissionState -PassThru | - Add-Member -MemberType NoteProperty -Name Grantee -Value $mockExpectedSqlServerLogin -PassThru | - Add-Member -MemberType NoteProperty -Name GrantorType -Value 'User' -PassThru | - Add-Member -MemberType NoteProperty -Name ObjectClass -Value 'Database' -PassThru | - Add-Member -MemberType NoteProperty -Name ObjectName -Value $mockSqlDatabaseName -PassThru - $mockEnumDatabasePermissions += New-Object Object | - Add-Member -MemberType NoteProperty -Name PermissionType -Value $mockSqlPermissionType02 -PassThru | - Add-Member -MemberType NoteProperty -Name PermissionState -Value $mockSqlPermissionState -PassThru | - Add-Member -MemberType NoteProperty -Name Grantee -Value $mockExpectedSqlServerLogin -PassThru | - Add-Member -MemberType NoteProperty -Name GrantorType -Value 'User' -PassThru | - Add-Member -MemberType NoteProperty -Name ObjectClass -Value 'Database' -PassThru | - Add-Member -MemberType NoteProperty -Name ObjectName -Value $mockSqlDatabaseName -PassThru - - $mockEnumDatabasePermissions - } - else - { - return $null - } - } -PassThru | - Add-Member -MemberType ScriptMethod -Name Grant -Value { - param - ( - [Parameter()] - [System.Object] - $permissionSet, - - [Parameter()] - [System.String] - $SqlServerLogin - ) - - $script:mockMethodGrantRan = $true - - if ( $SqlServerLogin -ne $mockExpectedSqlServerLogin ) - { - throw "Called mocked Grant() method without setting the right login name. Expected '{0}'. But was '{1}'." ` - -f $mockExpectedSqlServerLogin, $SqlServerLogin - } - } -PassThru | - Add-Member -MemberType ScriptMethod -Name Revoke -Value { - param - ( - [Parameter()] - [System.Object] - $permissionSet, - - [Parameter()] - [System.String] - $SqlServerLogin - ) - - $script:mockMethodRevokeRan = $true - - if ( $SqlServerLogin -ne $mockExpectedSqlServerLogin ) - { - throw "Called mocked Revoke() method without setting the right login name. Expected '{0}'. But was '{1}'." ` - -f $mockExpectedSqlServerLogin, $SqlServerLogin - } - } -PassThru | - Add-Member -MemberType ScriptMethod -Name Deny -Value { - param - ( - [Parameter()] - [System.Object] - $permissionSet, - - [Parameter()] - [System.String] - $SqlServerLogin - ) - - $script:mockMethodDenyRan = $true - - if ( $SqlServerLogin -ne $mockExpectedSqlServerLogin ) - { - throw "Called mocked Deny() method without setting the right login name. Expected '{0}'. But was '{1}'." ` - -f $mockExpectedSqlServerLogin, $SqlServerLogin - } - } -PassThru -Force - )) - } - } -PassThru -Force | - Add-Member -MemberType ScriptProperty -Name Logins -Value { - return @{ - $mockSqlServerLogin = @(( - New-Object Object | - Add-Member -MemberType NoteProperty -Name LoginType -Value $mockLoginType -PassThru - )) - $mockSqlServerLoginUnknown= @(( - New-Object Object | - Add-Member -MemberType NoteProperty -Name LoginType -Value $mockLoginType -PassThru - )) - } - } -PassThru -Force - ) - ) - } - - $mockNewObjectUser = { - return @( - ( - New-Object Object | - Add-Member -MemberType NoteProperty -Name Name -Value $mockSqlServerLoginUnknown -PassThru | - Add-Member -MemberType NoteProperty -Name Login -Value $mockSqlServerLoginUnknown -PassThru | - Add-Member -MemberType ScriptMethod -Name Create -Value { - $script:mockMethodCreateLoginRan = $true - - if ($mockInvalidOperationForCreateMethod) - { - throw 'Mock Create Method was called with invalid operation.' - } - if ( $this.Name -ne $mockExpectedSqlServerLogin ) - { - throw "Called mocked Create() method without adding the right user. Expected '{0}'. But was '{1}'." ` - -f $mockExpectedSqlServerLogin, $this.Name - } - } -PassThru -Force - ) - ) - } - - #endregion - - Describe "MSFT_xSQLServerDatabasePermission\Get-TargetResource" -Tag 'Get'{ - BeforeEach { - Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable - } - - Context 'When passing values to parameters and database name does not exist' { - It 'Should throw the correct error' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = 'unknownDatabaseName' - Name = $mockSqlServerLogin - PermissionState = 'Grant' - Permissions = @( 'Connect','Update' ) - } - - $throwInvalidOperation = ("Database 'unknownDatabaseName' does not exist " + ` - "on SQL server 'localhost\MSSQLSERVER'.") - - { Get-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When passing values to parameters and login name does not exist' { - It 'Should throw the correct error' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = 'unknownLoginName' - PermissionState = 'Grant' - Permissions = @( 'Connect','Update' ) - } - - $throwInvalidOperation = ("Login 'unknownLoginName' does not exist " + ` - "on SQL server 'localhost\MSSQLSERVER'.") - - { Get-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When passing values to parameters and database name and login name do exist' { - It 'Should throw the correct error with EnumDatabasePermissions method' { - $mockInvalidOperationEnumDatabasePermissions = $true - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'Grant' - Permissions = @( 'Connect','Update' ) - } - - $throwInvalidOperation = ('Failed to get permission for login named Zebes\SamusAran of ' + ` - 'the database named AdventureWorks on localhost\MSSQLSERVER.') - - { Get-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is in the desired state and ensure is set to Absent' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'Grant' - Permissions = @( 'Connect','Update','Select' ) - } - - It 'Should return the state as absent when the desired permission does not exist' { - $result = Get-TargetResource @testParameters - $result.Ensure | Should -Be 'Absent' - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the same values as passed as parameters' { - $result = Get-TargetResource @testParameters - $result.SQLServer | Should -Be $testParameters.SQLServer - $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName - $result.ServerRoleName | Should -Be $testParameters.ServerRoleName - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is not in the desired state and ensure is set to Absent' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'Grant' - Permissions = @( 'Connect','Update' ) - } - - It 'Should not return the state as absent when the desired permission does not exist' { - $result = Get-TargetResource @testParameters - $result.Ensure | Should -Not -Be 'Absent' - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the same values as passed as parameters' { - $result = Get-TargetResource @testParameters - $result.SQLServer | Should -Be $testParameters.SQLServer - $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName - $result.ServerRoleName | Should -Be $testParameters.ServerRoleName - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is in the desired state and ensure is set to Present' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'Grant' - Permissions = @( 'Connect','Update' ) - } - - It 'Should return the state as absent when the desired permission does not exist' { - $result = Get-TargetResource @testParameters - $result.Ensure | Should -Be 'Present' - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the same values as passed as parameters' { - $result = Get-TargetResource @testParameters - $result.SQLServer | Should -Be $testParameters.SQLServer - $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName - $result.ServerRoleName | Should -Be $testParameters.ServerRoleName - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is not in the desired state and ensure is set to Present' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'Grant' - Permissions = @( 'Connect','Update','Select' ) - } - - It 'Should not return the state as absent when the desired permission does not exist' { - $result = Get-TargetResource @testParameters - $result.Ensure | Should -Not -Be 'Present' - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the same values as passed as parameters' { - $result = Get-TargetResource @testParameters - $result.SQLServer | Should -Be $testParameters.SQLServer - $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName - $result.ServerRoleName | Should -Be $testParameters.ServerRoleName - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Assert-VerifiableMock - } - - Describe "MSFT_xSQLServerDatabasePermission\Test-TargetResource" -Tag 'Test'{ - BeforeEach { - Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable - } - - Context 'When passing values to parameters and database name does not exist' { - It 'Should throw the correct error' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = 'unknownDatabaseName' - Name = $mockSqlServerLogin - PermissionState = 'Grant' - Permissions = @( 'Connect','Update' ) - Ensure = 'Present' - } - - $throwInvalidOperation = ("Database 'unknownDatabaseName' does not exist " + ` - "on SQL server 'localhost\MSSQLSERVER'.") - - { Test-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When passing values to parameters and login name does not exist' { - It 'Should throw the correct error' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = 'unknownLoginName' - PermissionState = 'Grant' - Permissions = @( 'Connect','Update' ) - Ensure = 'Present' - } - - $throwInvalidOperation = ("Login 'unknownLoginName' does not exist " + ` - "on SQL server 'localhost\MSSQLSERVER'.") - - { Test-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When passing values to parameters and database name and login name do exist' { - It 'Should throw the correct error with EnumDatabasePermissions method' { - $mockInvalidOperationEnumDatabasePermissions = $true - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'Grant' - Permissions = @( 'Connect','Update' ) - Ensure = 'Present' - } - - $throwInvalidOperation = ('Failed to get permission for login named Zebes\SamusAran of ' + ` - 'the database named AdventureWorks on localhost\MSSQLSERVER.') - - { Test-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is in the desired state and ensure is set to Absent' { - It 'Should return the state as true when the desired permission does not exist' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'Grant' - Permissions = @( 'Connect','Update','Select' ) - Ensure = 'Absent' - } - - Test-TargetResource @testParameters | Should -Be $true - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is not in the desired state and ensure is set to Absent' { - It 'Should return the state as false when the desired permission does not exist' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'Grant' - Permissions = @( 'Connect','Update' ) - Ensure = 'Absent' - } - - Test-TargetResource @testParameters | Should -Be $false - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is not in the desired state and ensure is set to Present' { - It 'Should return the state as false when the desired permission does not exist' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'Grant' - Permissions = @( 'Connect','Update','Select' ) - Ensure = 'Present' - } - - Test-TargetResource @testParameters | Should -Be $false - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is in the desired state and ensure is set to Present' { - It 'Should return the state as true when the desired permission does exist' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'Grant' - Permissions = @( 'Connect','Update' ) - Ensure = 'Present' - } - - Test-TargetResource @testParameters | Should -Be $true - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Assert-VerifiableMock - } - - Describe "MSFT_xSQLServerDatabasePermission\Set-TargetResource" -Tag 'Set'{ - BeforeEach { - Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable - Mock -CommandName New-Object -MockWith $mockNewObjectUser -ParameterFilter { - $TypeName -eq 'Microsoft.SqlServer.Management.Smo.User' - } -Verifiable - - $script:mockMethodGrantRan = $false - $script:mockMethodDenyRan = $false - $script:mockMethodRevokeRan = $false - $script:mockMethodCreateLoginRan = $false - } - - Context 'When passing values to parameters and database name does not exist' { - It 'Should throw the correct error' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = 'unknownDatabaseName' - Name = $mockSqlServerLogin - PermissionState = 'Grant' - Permissions = @( 'Connect','Update' ) - Ensure = 'Present' - } - - $throwInvalidOperation = ("Database 'unknownDatabaseName' does not exist " + ` - "on SQL server 'localhost\MSSQLSERVER'.") - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When passing values to parameters and login name does not exist' { - It 'Should throw the correct error' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = 'unknownLoginName' - PermissionState = 'Grant' - Permissions = @( 'Connect','Update' ) - Ensure = 'Present' - } - - $throwInvalidOperation = ("Login 'unknownLoginName' does not exist " + ` - "on SQL server 'localhost\MSSQLSERVER'.") - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the login cannot be created' { - It 'Should throw the correct error' { - $mockInvalidOperationForCreateMethod = $true - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLoginUnknown - PermissionState = 'Grant' - Permissions = @( 'Connect','Update' ) - Ensure = 'Present' - } - - $throwInvalidOperation = ('Failed adding the login Elysia\Chozo ' + ` - 'as a user of the database AdventureWorks, ' + ` - 'on the instance localhost\MSSQLSERVER.') - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - $script:mockMethodCreateLoginRan | Should -Be $true - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is not in the desired state' { - Context 'When the mock methods fail (testing the test)' { - BeforeAll { - $throwInvalidOperation = ('Failed to set permission for login named ' + ` - 'Zebes\SamusAran of the database named ' + ` - 'AdventureWorks on localhost\MSSQLSERVER.') - - $mockExpectedSqlServerLogin = $mockSqlServerLoginUnknown - } - - It 'Should throw the correct error when mock Grant() method is called' { - $testParameters = $mockDefaultParameters.Clone() - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'Grant' - Permissions = @( 'Connect','Update' ) - Ensure = 'Present' - } - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - $script:mockMethodGrantRan | Should -Be $true - $script:mockMethodDenyRan | Should -Be $false - $script:mockMethodRevokeRan | Should -Be $false - } - - It 'Should throw the correct error when mock Grant() method is called (for GrantWithGrant)' { - $testParameters = $mockDefaultParameters.Clone() - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'GrantWithGrant' - Permissions = @( 'Connect','Update' ) - Ensure = 'Present' - } - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - $script:mockMethodGrantRan | Should -Be $true - $script:mockMethodDenyRan | Should -Be $false - $script:mockMethodRevokeRan | Should -Be $false - } - - - It 'Should throw the correct error when mock Deny() method is called' { - $testParameters = $mockDefaultParameters.Clone() - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'Deny' - Permissions = @( 'Connect','Update' ) - Ensure = 'Present' - } - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - $script:mockMethodGrantRan | Should -Be $false - $script:mockMethodDenyRan | Should -Be $true - $script:mockMethodRevokeRan | Should -Be $false - } - - It 'Should throw the correct error when mock Revoke() method is called' { - $testParameters = $mockDefaultParameters.Clone() - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'Grant' - Permissions = @( 'Connect','Update' ) - Ensure = 'Absent' - } - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - $script:mockMethodGrantRan | Should -Be $false - $script:mockMethodDenyRan | Should -Be $false - $script:mockMethodRevokeRan | Should -Be $true - } - - It 'Should throw the correct error when mock Revoke() method is called' { - $testParameters = $mockDefaultParameters.Clone() - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'GrantWithGrant' - Permissions = @( 'Connect','Update' ) - Ensure = 'Absent' - } - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - $script:mockMethodGrantRan | Should -Be $false - $script:mockMethodDenyRan | Should -Be $false - $script:mockMethodRevokeRan | Should -Be $true - } - } - - Context 'When Ensure is set to Present' { - Context 'When the login does not exist' { - It 'Should create the login without throwing an error' { - $mockInvalidOperationForCreateMethod = $false - $mockExpectedSqlServerLogin = $mockSqlServerLoginUnknown - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLoginUnknown - PermissionState = 'Grant' - Permissions = @( 'Connect','Update' ) - Ensure = 'Present' - } - - { Set-TargetResource @testParameters } | Should -Not -Throw - - $script:mockMethodCreateLoginRan | Should -Be $true - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - It 'Should call the method Grant() without throwing' { - $mockExpectedSqlServerLogin = $mockSqlServerLogin - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'Grant' - Permissions = @( 'Connect','Update' ) - Ensure = 'Present' - } - - { Set-TargetResource @testParameters } | Should -Not -Throw - - $script:mockMethodGrantRan | Should -Be $true - $script:mockMethodDenyRan | Should -Be $false - $script:mockMethodRevokeRan | Should -Be $false - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should call the method Grant() (WithGrant) without throwing' { - $mockExpectedSqlServerLogin = $mockSqlServerLogin - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'GrantWithGrant' - Permissions = @( 'Connect','Update' ) - Ensure = 'Present' - } - - { Set-TargetResource @testParameters } | Should -Not -Throw - - $script:mockMethodGrantRan | Should -Be $true - $script:mockMethodDenyRan | Should -Be $false - $script:mockMethodRevokeRan | Should -Be $false - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should call the method Deny() without throwing' { - $mockExpectedSqlServerLogin = $mockSqlServerLogin - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'Deny' - Permissions = @( 'Connect','Update' ) - Ensure = 'Present' - } - - { Set-TargetResource @testParameters } | Should -Not -Throw - - $script:mockMethodGrantRan | Should -Be $false - $script:mockMethodDenyRan | Should -Be $true - $script:mockMethodRevokeRan | Should -Be $false - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When Ensure is set to Absent' { - It 'Should call the method Revoke() for permission state ''Grant'' without throwing' { - $mockExpectedSqlServerLogin = $mockSqlServerLogin - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'Grant' - Permissions = @( 'Connect','Update' ) - Ensure = 'Absent' - } - - { Set-TargetResource @testParameters } | Should -Not -Throw - - $script:mockMethodGrantRan | Should -Be $false - $script:mockMethodDenyRan | Should -Be $false - $script:mockMethodRevokeRan | Should -Be $true - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should call the method Revoke() for permission state ''GrantWithGrant'' without throwing' { - $mockExpectedSqlServerLogin = $mockSqlServerLogin - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'GrantWithGrant' - Permissions = @( 'Connect','Update' ) - Ensure = 'Absent' - } - - { Set-TargetResource @testParameters } | Should -Not -Throw - - $script:mockMethodGrantRan | Should -Be $false - $script:mockMethodDenyRan | Should -Be $false - $script:mockMethodRevokeRan | Should -Be $true - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should call the method Revoke() for permission state ''Deny'' without throwing' { - $mockExpectedSqlServerLogin = $mockSqlServerLogin - $testParameters = $mockDefaultParameters - $testParameters += @{ - Database = $mockSqlDatabaseName - Name = $mockSqlServerLogin - PermissionState = 'Deny' - Permissions = @( 'Connect','Update' ) - Ensure = 'Absent' - } - - { Set-TargetResource @testParameters } | Should -Not -Throw - - $script:mockMethodGrantRan | Should -Be $false - $script:mockMethodDenyRan | Should -Be $false - $script:mockMethodRevokeRan | Should -Be $true - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - } - - Assert-VerifiableMock - } - } -} -finally -{ - Invoke-TestCleanup -}#endregion +$script:DSCModuleName = 'SqlServerDSC' +$script:DSCResourceName = 'MSFT_SqlDatabasePermission' + +#region HEADER + +# Unit Test Template Version: 1.2.0 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) +} + +Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $script:DSCModuleName ` + -DSCResourceName $script:DSCResourceName ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup { + # Loading mocked classes + Add-Type -Path (Join-Path -Path $script:moduleRoot -ChildPath 'Tests\Unit\Stubs\SMO.cs') +} + +function Invoke-TestCleanup { + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope $script:DSCResourceName { + $mockSqlServerName = 'localhost' + $mockSqlServerInstanceName = 'MSSQLSERVER' + $mockSqlDatabaseName = 'AdventureWorks' + $mockSqlServerLogin = 'Zebes\SamusAran' + $mockSqlServerLoginUnknown = 'Elysia\Chozo' + $mockLoginType = 'WindowsUser' + $mockInvalidOperationEnumDatabasePermissions = $false + $mockInvalidOperationForCreateMethod = $false + $mockExpectedSqlServerLogin = 'Zebes\SamusAran' + $mockSqlPermissionState = 'Grant' + + $mockSqlPermissionType01 = New-Object -TypeName Microsoft.SqlServer.Management.Smo.DatabasePermissionSet -ArgumentList ($true, $false) + $mockSqlPermissionType02 = New-Object -TypeName Microsoft.SqlServer.Management.Smo.DatabasePermissionSet -ArgumentList ($false, $true) + + $script:mockMethodGrantRan = $false + $script:mockMethodDenyRan = $false + $script:mockMethodRevokeRan = $false + $script:mockMethodCreateLoginRan = $false + + # Default parameters that are used for the It-blocks + $mockDefaultParameters = @{ + SQLInstanceName = $mockSqlServerInstanceName + SQLServer = $mockSqlServerName + } + + #region Function mocks + $mockConnectSQL = { + return @( + ( + New-Object Object | + Add-Member -MemberType NoteProperty -Name InstanceName -Value $mockSqlServerInstanceName -PassThru | + Add-Member -MemberType NoteProperty -Name ComputerNamePhysicalNetBIOS -Value $mockSqlServerName -PassThru | + Add-Member -MemberType ScriptProperty -Name Databases -Value { + return @{ + $mockSqlDatabaseName = @(( + New-Object Object | + Add-Member -MemberType NoteProperty -Name Name -Value $mockSqlDatabaseName -PassThru | + Add-Member -MemberType ScriptProperty -Name Users -Value { + return @{ + $mockSqlServerLogin = @(( + New-Object Object | + Add-Member -MemberType ScriptMethod -Name IsMember -Value { + return $true + } -PassThru + )) + } + } -PassThru | + Add-Member -MemberType ScriptMethod -Name EnumDatabasePermissions -Value { + param + ( + [Parameter()] + [System.String] + $SqlServerLogin + ) + if ($mockInvalidOperationEnumDatabasePermissions) + { + throw 'Mock EnumDatabasePermissions Method was called with invalid operation.' + } + + if ( $SqlServerLogin -eq $mockExpectedSqlServerLogin ) + { + $mockEnumDatabasePermissions = @() + $mockEnumDatabasePermissions += New-Object Object | + Add-Member -MemberType NoteProperty -Name PermissionType -Value $mockSqlPermissionType01 -PassThru | + Add-Member -MemberType NoteProperty -Name PermissionState -Value $mockSqlPermissionState -PassThru | + Add-Member -MemberType NoteProperty -Name Grantee -Value $mockExpectedSqlServerLogin -PassThru | + Add-Member -MemberType NoteProperty -Name GrantorType -Value 'User' -PassThru | + Add-Member -MemberType NoteProperty -Name ObjectClass -Value 'Database' -PassThru | + Add-Member -MemberType NoteProperty -Name ObjectName -Value $mockSqlDatabaseName -PassThru + $mockEnumDatabasePermissions += New-Object Object | + Add-Member -MemberType NoteProperty -Name PermissionType -Value $mockSqlPermissionType02 -PassThru | + Add-Member -MemberType NoteProperty -Name PermissionState -Value $mockSqlPermissionState -PassThru | + Add-Member -MemberType NoteProperty -Name Grantee -Value $mockExpectedSqlServerLogin -PassThru | + Add-Member -MemberType NoteProperty -Name GrantorType -Value 'User' -PassThru | + Add-Member -MemberType NoteProperty -Name ObjectClass -Value 'Database' -PassThru | + Add-Member -MemberType NoteProperty -Name ObjectName -Value $mockSqlDatabaseName -PassThru + + $mockEnumDatabasePermissions + } + else + { + return $null + } + } -PassThru | + Add-Member -MemberType ScriptMethod -Name Grant -Value { + param + ( + [Parameter()] + [System.Object] + $permissionSet, + + [Parameter()] + [System.String] + $SqlServerLogin + ) + + $script:mockMethodGrantRan = $true + + if ( $SqlServerLogin -ne $mockExpectedSqlServerLogin ) + { + throw "Called mocked Grant() method without setting the right login name. Expected '{0}'. But was '{1}'." ` + -f $mockExpectedSqlServerLogin, $SqlServerLogin + } + } -PassThru | + Add-Member -MemberType ScriptMethod -Name Revoke -Value { + param + ( + [Parameter()] + [System.Object] + $permissionSet, + + [Parameter()] + [System.String] + $SqlServerLogin + ) + + $script:mockMethodRevokeRan = $true + + if ( $SqlServerLogin -ne $mockExpectedSqlServerLogin ) + { + throw "Called mocked Revoke() method without setting the right login name. Expected '{0}'. But was '{1}'." ` + -f $mockExpectedSqlServerLogin, $SqlServerLogin + } + } -PassThru | + Add-Member -MemberType ScriptMethod -Name Deny -Value { + param + ( + [Parameter()] + [System.Object] + $permissionSet, + + [Parameter()] + [System.String] + $SqlServerLogin + ) + + $script:mockMethodDenyRan = $true + + if ( $SqlServerLogin -ne $mockExpectedSqlServerLogin ) + { + throw "Called mocked Deny() method without setting the right login name. Expected '{0}'. But was '{1}'." ` + -f $mockExpectedSqlServerLogin, $SqlServerLogin + } + } -PassThru -Force + )) + } + } -PassThru -Force | + Add-Member -MemberType ScriptProperty -Name Logins -Value { + return @{ + $mockSqlServerLogin = @(( + New-Object Object | + Add-Member -MemberType NoteProperty -Name LoginType -Value $mockLoginType -PassThru + )) + $mockSqlServerLoginUnknown= @(( + New-Object Object | + Add-Member -MemberType NoteProperty -Name LoginType -Value $mockLoginType -PassThru + )) + } + } -PassThru -Force + ) + ) + } + + $mockNewObjectUser = { + return @( + ( + New-Object Object | + Add-Member -MemberType NoteProperty -Name Name -Value $mockSqlServerLoginUnknown -PassThru | + Add-Member -MemberType NoteProperty -Name Login -Value $mockSqlServerLoginUnknown -PassThru | + Add-Member -MemberType ScriptMethod -Name Create -Value { + $script:mockMethodCreateLoginRan = $true + + if ($mockInvalidOperationForCreateMethod) + { + throw 'Mock Create Method was called with invalid operation.' + } + if ( $this.Name -ne $mockExpectedSqlServerLogin ) + { + throw "Called mocked Create() method without adding the right user. Expected '{0}'. But was '{1}'." ` + -f $mockExpectedSqlServerLogin, $this.Name + } + } -PassThru -Force + ) + ) + } + + #endregion + + Describe "MSFT_SqlDatabasePermission\Get-TargetResource" -Tag 'Get'{ + BeforeEach { + Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable + } + + Context 'When passing values to parameters and database name does not exist' { + It 'Should throw the correct error' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = 'unknownDatabaseName' + Name = $mockSqlServerLogin + PermissionState = 'Grant' + Permissions = @( 'Connect','Update' ) + } + + $throwInvalidOperation = ("Database 'unknownDatabaseName' does not exist " + ` + "on SQL server 'localhost\MSSQLSERVER'.") + + { Get-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When passing values to parameters and login name does not exist' { + It 'Should throw the correct error' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = 'unknownLoginName' + PermissionState = 'Grant' + Permissions = @( 'Connect','Update' ) + } + + $throwInvalidOperation = ("Login 'unknownLoginName' does not exist " + ` + "on SQL server 'localhost\MSSQLSERVER'.") + + { Get-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When passing values to parameters and database name and login name do exist' { + It 'Should throw the correct error with EnumDatabasePermissions method' { + $mockInvalidOperationEnumDatabasePermissions = $true + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'Grant' + Permissions = @( 'Connect','Update' ) + } + + $throwInvalidOperation = ('Failed to get permission for login named Zebes\SamusAran of ' + ` + 'the database named AdventureWorks on localhost\MSSQLSERVER.') + + { Get-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is in the desired state and ensure is set to Absent' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'Grant' + Permissions = @( 'Connect','Update','Select' ) + } + + It 'Should return the state as absent when the desired permission does not exist' { + $result = Get-TargetResource @testParameters + $result.Ensure | Should -Be 'Absent' + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the same values as passed as parameters' { + $result = Get-TargetResource @testParameters + $result.SQLServer | Should -Be $testParameters.SQLServer + $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName + $result.ServerRoleName | Should -Be $testParameters.ServerRoleName + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is not in the desired state and ensure is set to Absent' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'Grant' + Permissions = @( 'Connect','Update' ) + } + + It 'Should not return the state as absent when the desired permission does not exist' { + $result = Get-TargetResource @testParameters + $result.Ensure | Should -Not -Be 'Absent' + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the same values as passed as parameters' { + $result = Get-TargetResource @testParameters + $result.SQLServer | Should -Be $testParameters.SQLServer + $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName + $result.ServerRoleName | Should -Be $testParameters.ServerRoleName + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is in the desired state and ensure is set to Present' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'Grant' + Permissions = @( 'Connect','Update' ) + } + + It 'Should return the state as absent when the desired permission does not exist' { + $result = Get-TargetResource @testParameters + $result.Ensure | Should -Be 'Present' + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the same values as passed as parameters' { + $result = Get-TargetResource @testParameters + $result.SQLServer | Should -Be $testParameters.SQLServer + $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName + $result.ServerRoleName | Should -Be $testParameters.ServerRoleName + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is not in the desired state and ensure is set to Present' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'Grant' + Permissions = @( 'Connect','Update','Select' ) + } + + It 'Should not return the state as absent when the desired permission does not exist' { + $result = Get-TargetResource @testParameters + $result.Ensure | Should -Not -Be 'Present' + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the same values as passed as parameters' { + $result = Get-TargetResource @testParameters + $result.SQLServer | Should -Be $testParameters.SQLServer + $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName + $result.ServerRoleName | Should -Be $testParameters.ServerRoleName + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Assert-VerifiableMock + } + + Describe "MSFT_SqlDatabasePermission\Test-TargetResource" -Tag 'Test'{ + BeforeEach { + Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable + } + + Context 'When passing values to parameters and database name does not exist' { + It 'Should throw the correct error' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = 'unknownDatabaseName' + Name = $mockSqlServerLogin + PermissionState = 'Grant' + Permissions = @( 'Connect','Update' ) + Ensure = 'Present' + } + + $throwInvalidOperation = ("Database 'unknownDatabaseName' does not exist " + ` + "on SQL server 'localhost\MSSQLSERVER'.") + + { Test-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When passing values to parameters and login name does not exist' { + It 'Should throw the correct error' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = 'unknownLoginName' + PermissionState = 'Grant' + Permissions = @( 'Connect','Update' ) + Ensure = 'Present' + } + + $throwInvalidOperation = ("Login 'unknownLoginName' does not exist " + ` + "on SQL server 'localhost\MSSQLSERVER'.") + + { Test-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When passing values to parameters and database name and login name do exist' { + It 'Should throw the correct error with EnumDatabasePermissions method' { + $mockInvalidOperationEnumDatabasePermissions = $true + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'Grant' + Permissions = @( 'Connect','Update' ) + Ensure = 'Present' + } + + $throwInvalidOperation = ('Failed to get permission for login named Zebes\SamusAran of ' + ` + 'the database named AdventureWorks on localhost\MSSQLSERVER.') + + { Test-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is in the desired state and ensure is set to Absent' { + It 'Should return the state as true when the desired permission does not exist' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'Grant' + Permissions = @( 'Connect','Update','Select' ) + Ensure = 'Absent' + } + + Test-TargetResource @testParameters | Should -Be $true + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is not in the desired state and ensure is set to Absent' { + It 'Should return the state as false when the desired permission does not exist' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'Grant' + Permissions = @( 'Connect','Update' ) + Ensure = 'Absent' + } + + Test-TargetResource @testParameters | Should -Be $false + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is not in the desired state and ensure is set to Present' { + It 'Should return the state as false when the desired permission does not exist' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'Grant' + Permissions = @( 'Connect','Update','Select' ) + Ensure = 'Present' + } + + Test-TargetResource @testParameters | Should -Be $false + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is in the desired state and ensure is set to Present' { + It 'Should return the state as true when the desired permission does exist' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'Grant' + Permissions = @( 'Connect','Update' ) + Ensure = 'Present' + } + + Test-TargetResource @testParameters | Should -Be $true + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Assert-VerifiableMock + } + + Describe "MSFT_SqlDatabasePermission\Set-TargetResource" -Tag 'Set'{ + BeforeEach { + Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable + Mock -CommandName New-Object -MockWith $mockNewObjectUser -ParameterFilter { + $TypeName -eq 'Microsoft.SqlServer.Management.Smo.User' + } -Verifiable + + $script:mockMethodGrantRan = $false + $script:mockMethodDenyRan = $false + $script:mockMethodRevokeRan = $false + $script:mockMethodCreateLoginRan = $false + } + + Context 'When passing values to parameters and database name does not exist' { + It 'Should throw the correct error' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = 'unknownDatabaseName' + Name = $mockSqlServerLogin + PermissionState = 'Grant' + Permissions = @( 'Connect','Update' ) + Ensure = 'Present' + } + + $throwInvalidOperation = ("Database 'unknownDatabaseName' does not exist " + ` + "on SQL server 'localhost\MSSQLSERVER'.") + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When passing values to parameters and login name does not exist' { + It 'Should throw the correct error' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = 'unknownLoginName' + PermissionState = 'Grant' + Permissions = @( 'Connect','Update' ) + Ensure = 'Present' + } + + $throwInvalidOperation = ("Login 'unknownLoginName' does not exist " + ` + "on SQL server 'localhost\MSSQLSERVER'.") + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the login cannot be created' { + It 'Should throw the correct error' { + $mockInvalidOperationForCreateMethod = $true + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLoginUnknown + PermissionState = 'Grant' + Permissions = @( 'Connect','Update' ) + Ensure = 'Present' + } + + $throwInvalidOperation = ('Failed adding the login Elysia\Chozo ' + ` + 'as a user of the database AdventureWorks, ' + ` + 'on the instance localhost\MSSQLSERVER.') + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + $script:mockMethodCreateLoginRan | Should -Be $true + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is not in the desired state' { + Context 'When the mock methods fail (testing the test)' { + BeforeAll { + $throwInvalidOperation = ('Failed to set permission for login named ' + ` + 'Zebes\SamusAran of the database named ' + ` + 'AdventureWorks on localhost\MSSQLSERVER.') + + $mockExpectedSqlServerLogin = $mockSqlServerLoginUnknown + } + + It 'Should throw the correct error when mock Grant() method is called' { + $testParameters = $mockDefaultParameters.Clone() + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'Grant' + Permissions = @( 'Connect','Update' ) + Ensure = 'Present' + } + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + $script:mockMethodGrantRan | Should -Be $true + $script:mockMethodDenyRan | Should -Be $false + $script:mockMethodRevokeRan | Should -Be $false + } + + It 'Should throw the correct error when mock Grant() method is called (for GrantWithGrant)' { + $testParameters = $mockDefaultParameters.Clone() + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'GrantWithGrant' + Permissions = @( 'Connect','Update' ) + Ensure = 'Present' + } + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + $script:mockMethodGrantRan | Should -Be $true + $script:mockMethodDenyRan | Should -Be $false + $script:mockMethodRevokeRan | Should -Be $false + } + + + It 'Should throw the correct error when mock Deny() method is called' { + $testParameters = $mockDefaultParameters.Clone() + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'Deny' + Permissions = @( 'Connect','Update' ) + Ensure = 'Present' + } + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + $script:mockMethodGrantRan | Should -Be $false + $script:mockMethodDenyRan | Should -Be $true + $script:mockMethodRevokeRan | Should -Be $false + } + + It 'Should throw the correct error when mock Revoke() method is called' { + $testParameters = $mockDefaultParameters.Clone() + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'Grant' + Permissions = @( 'Connect','Update' ) + Ensure = 'Absent' + } + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + $script:mockMethodGrantRan | Should -Be $false + $script:mockMethodDenyRan | Should -Be $false + $script:mockMethodRevokeRan | Should -Be $true + } + + It 'Should throw the correct error when mock Revoke() method is called' { + $testParameters = $mockDefaultParameters.Clone() + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'GrantWithGrant' + Permissions = @( 'Connect','Update' ) + Ensure = 'Absent' + } + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + $script:mockMethodGrantRan | Should -Be $false + $script:mockMethodDenyRan | Should -Be $false + $script:mockMethodRevokeRan | Should -Be $true + } + } + + Context 'When Ensure is set to Present' { + Context 'When the login does not exist' { + It 'Should create the login without throwing an error' { + $mockInvalidOperationForCreateMethod = $false + $mockExpectedSqlServerLogin = $mockSqlServerLoginUnknown + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLoginUnknown + PermissionState = 'Grant' + Permissions = @( 'Connect','Update' ) + Ensure = 'Present' + } + + { Set-TargetResource @testParameters } | Should -Not -Throw + + $script:mockMethodCreateLoginRan | Should -Be $true + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + It 'Should call the method Grant() without throwing' { + $mockExpectedSqlServerLogin = $mockSqlServerLogin + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'Grant' + Permissions = @( 'Connect','Update' ) + Ensure = 'Present' + } + + { Set-TargetResource @testParameters } | Should -Not -Throw + + $script:mockMethodGrantRan | Should -Be $true + $script:mockMethodDenyRan | Should -Be $false + $script:mockMethodRevokeRan | Should -Be $false + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should call the method Grant() (WithGrant) without throwing' { + $mockExpectedSqlServerLogin = $mockSqlServerLogin + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'GrantWithGrant' + Permissions = @( 'Connect','Update' ) + Ensure = 'Present' + } + + { Set-TargetResource @testParameters } | Should -Not -Throw + + $script:mockMethodGrantRan | Should -Be $true + $script:mockMethodDenyRan | Should -Be $false + $script:mockMethodRevokeRan | Should -Be $false + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should call the method Deny() without throwing' { + $mockExpectedSqlServerLogin = $mockSqlServerLogin + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'Deny' + Permissions = @( 'Connect','Update' ) + Ensure = 'Present' + } + + { Set-TargetResource @testParameters } | Should -Not -Throw + + $script:mockMethodGrantRan | Should -Be $false + $script:mockMethodDenyRan | Should -Be $true + $script:mockMethodRevokeRan | Should -Be $false + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When Ensure is set to Absent' { + It 'Should call the method Revoke() for permission state ''Grant'' without throwing' { + $mockExpectedSqlServerLogin = $mockSqlServerLogin + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'Grant' + Permissions = @( 'Connect','Update' ) + Ensure = 'Absent' + } + + { Set-TargetResource @testParameters } | Should -Not -Throw + + $script:mockMethodGrantRan | Should -Be $false + $script:mockMethodDenyRan | Should -Be $false + $script:mockMethodRevokeRan | Should -Be $true + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should call the method Revoke() for permission state ''GrantWithGrant'' without throwing' { + $mockExpectedSqlServerLogin = $mockSqlServerLogin + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'GrantWithGrant' + Permissions = @( 'Connect','Update' ) + Ensure = 'Absent' + } + + { Set-TargetResource @testParameters } | Should -Not -Throw + + $script:mockMethodGrantRan | Should -Be $false + $script:mockMethodDenyRan | Should -Be $false + $script:mockMethodRevokeRan | Should -Be $true + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should call the method Revoke() for permission state ''Deny'' without throwing' { + $mockExpectedSqlServerLogin = $mockSqlServerLogin + $testParameters = $mockDefaultParameters + $testParameters += @{ + Database = $mockSqlDatabaseName + Name = $mockSqlServerLogin + PermissionState = 'Deny' + Permissions = @( 'Connect','Update' ) + Ensure = 'Absent' + } + + { Set-TargetResource @testParameters } | Should -Not -Throw + + $script:mockMethodGrantRan | Should -Be $false + $script:mockMethodDenyRan | Should -Be $false + $script:mockMethodRevokeRan | Should -Be $true + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + } + + Assert-VerifiableMock + } + } +} +finally +{ + Invoke-TestCleanup +}#endregion diff --git a/Tests/Unit/MSFT_xSQLServerDatabaseRecoveryModel.Tests.ps1 b/Tests/Unit/MSFT_SqlDatabaseRecoveryModel.Tests.ps1 similarity index 96% rename from Tests/Unit/MSFT_xSQLServerDatabaseRecoveryModel.Tests.ps1 rename to Tests/Unit/MSFT_SqlDatabaseRecoveryModel.Tests.ps1 index 5c0e09105..92017da44 100644 --- a/Tests/Unit/MSFT_xSQLServerDatabaseRecoveryModel.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlDatabaseRecoveryModel.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerDatabaseRecoveryModel' +$script:DSCModuleName = 'SqlServerDSC' +$script:DSCResourceName = 'MSFT_SqlDatabaseRecoveryModel' #region HEADER @@ -77,7 +77,7 @@ try } #endregion - Describe "MSFT_xSQLServerDatabaseRecoveryModel\Get-TargetResource" -Tag 'Get'{ + Describe "MSFT_SqlDatabaseRecoveryModel\Get-TargetResource" -Tag 'Get'{ BeforeEach { Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable } @@ -150,7 +150,7 @@ try Assert-VerifiableMock } - Describe "MSFT_xSQLServerDatabaseRecoveryModel\Test-TargetResource" -Tag 'Test'{ + Describe "MSFT_SqlDatabaseRecoveryModel\Test-TargetResource" -Tag 'Test'{ BeforeEach { Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable } @@ -192,7 +192,7 @@ try Assert-VerifiableMock } - Describe "MSFT_xSQLServerDatabaseRecoveryModel\Set-TargetResource" -Tag 'Set'{ + Describe "MSFT_SqlDatabaseRecoveryModel\Set-TargetResource" -Tag 'Set'{ BeforeEach { Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable } diff --git a/Tests/Unit/MSFT_xSQLServerDatabaseRole.Tests.ps1 b/Tests/Unit/MSFT_SqlDatabaseRole.Tests.ps1 similarity index 99% rename from Tests/Unit/MSFT_xSQLServerDatabaseRole.Tests.ps1 rename to Tests/Unit/MSFT_SqlDatabaseRole.Tests.ps1 index d8af7bd41..bb077a590 100644 --- a/Tests/Unit/MSFT_xSQLServerDatabaseRole.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlDatabaseRole.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerDatabaseRole' +$script:DSCModuleName = 'SqlServerDSC' +$script:DSCResourceName = 'MSFT_SqlDatabaseRole' #region HEADER @@ -215,7 +215,7 @@ try } #endregion - Describe "MSFT_xSQLServerDatabaseRole\Get-TargetResource" -Tag 'Get'{ + Describe "MSFT_SqlDatabaseRole\Get-TargetResource" -Tag 'Get'{ BeforeEach { Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable } @@ -419,7 +419,7 @@ try Assert-VerifiableMock } - Describe "MSFT_xSQLServerDatabaseRole\Test-TargetResource" -Tag 'Test'{ + Describe "MSFT_SqlDatabaseRole\Test-TargetResource" -Tag 'Test'{ BeforeEach { Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable } @@ -541,7 +541,7 @@ try Assert-VerifiableMock } - Describe "MSFT_xSQLServerDatabaseRole\Set-TargetResource" -Tag 'Set'{ + Describe "MSFT_SqlDatabaseRole\Set-TargetResource" -Tag 'Set'{ BeforeEach { Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable Mock -CommandName New-Object -MockWith $mockNewObjectUser -ParameterFilter { diff --git a/Tests/Unit/MSFT_xSQLServerRSConfig.Tests.ps1 b/Tests/Unit/MSFT_SqlRS.Tests.ps1 similarity index 99% rename from Tests/Unit/MSFT_xSQLServerRSConfig.Tests.ps1 rename to Tests/Unit/MSFT_SqlRS.Tests.ps1 index 31bd51852..a6e7a8fab 100644 --- a/Tests/Unit/MSFT_xSQLServerRSConfig.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlRS.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerRSConfig' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlRS' #region HEADER @@ -190,7 +190,7 @@ try $Class -eq 'Win32_OperatingSystem' } - Describe "xSQLServerRSConfig\Get-TargetResource" -Tag 'Get' { + Describe "SqlRS\Get-TargetResource" -Tag 'Get' { BeforeAll { $mockDynamic_SqlBuildVersion = '13.0.4001.0' @@ -308,7 +308,7 @@ try Assert-VerifiableMock } - Describe "xSQLServerRSConfig\Set-TargetResource" -Tag 'Set' { + Describe "SqlRS\Set-TargetResource" -Tag 'Set' { BeforeAll { Mock -CommandName Import-SQLPSModule -Verifiable Mock -CommandName Invoke-Sqlcmd -Verifiable @@ -504,7 +504,7 @@ try Assert-VerifiableMock } - Describe "xSQLServerRSConfig\Test-TargetResource" -Tag 'Test' { + Describe "SqlRS\Test-TargetResource" -Tag 'Test' { Context 'When the system is not in the desired state' { Context 'When Reporting Services are not initialized' { BeforeAll { diff --git a/Tests/Unit/MSFT_xSQLServerScript.Tests.ps1 b/Tests/Unit/MSFT_SqlScript.Tests.ps1 similarity index 97% rename from Tests/Unit/MSFT_xSQLServerScript.Tests.ps1 rename to Tests/Unit/MSFT_SqlScript.Tests.ps1 index 133e725ab..2bcc921c7 100644 --- a/Tests/Unit/MSFT_xSQLServerScript.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlScript.Tests.ps1 @@ -1,6 +1,6 @@ <# .SYNOPSIS - Automated unit test for MSFT_xSQLServerScript DSC Resource + Automated unit test for MSFT_SqlScript DSC Resource #> # Suppression of this PSSA rule allowed in tests. @@ -20,8 +20,8 @@ if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCR Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force $TestEnvironment = Initialize-TestEnvironment ` - -DSCModuleName 'xSQLServer' ` - -DSCResourceName 'MSFT_xSQLServerScript' ` + -DSCModuleName 'SqlServerDSC' ` + -DSCResourceName 'MSFT_SqlScript' ` -TestType Unit #endregion HEADER @@ -41,9 +41,9 @@ try { Invoke-TestSetup - InModuleScope 'MSFT_xSQLServerScript' { - $script:DSCModuleName = 'xSQLServer' - $resourceName = 'MSFT_xSQLServerScript' + InModuleScope 'MSFT_SqlScript' { + $script:DSCModuleName = 'SQLServerDSC' + $resourceName = 'MSFT_SqlScript' $testParameters = @{ ServerInstance = $env:COMPUTERNAME diff --git a/Tests/Unit/MSFT_xSQLServerConfiguration.Tests.ps1 b/Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 similarity index 99% rename from Tests/Unit/MSFT_xSQLServerConfiguration.Tests.ps1 rename to Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 index bf332cf84..12aae9ee4 100644 --- a/Tests/Unit/MSFT_xSQLServerConfiguration.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerConfiguration.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerConfiguration' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlServerDSCConfiguration' # Unit Test Template Version: 1.1.0 [String] $script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) diff --git a/Tests/Unit/MSFT_xSQLServerEndpoint.Tests.ps1 b/Tests/Unit/MSFT_SqlServerEndpoint.Tests.ps1 similarity index 98% rename from Tests/Unit/MSFT_xSQLServerEndpoint.Tests.ps1 rename to Tests/Unit/MSFT_SqlServerEndpoint.Tests.ps1 index 1ea60283a..4b27c5899 100644 --- a/Tests/Unit/MSFT_xSQLServerEndpoint.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerEndpoint.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerEndpoint' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlServerEndpoint' #region HEADER @@ -141,7 +141,7 @@ try EndpointName = $mockEndpointName } - Describe 'MSFT_xSQLServerEndpoint\Get-TargetResource' -Tag 'Get' { + Describe 'MSFT_SqlServerEndpoint\Get-TargetResource' -Tag 'Get' { BeforeEach { $testParameters = $defaultParameters @@ -225,7 +225,7 @@ try Assert-VerifiableMock } - Describe 'MSFT_xSQLServerEndpoint\Test-TargetResource' -Tag 'Test' { + Describe 'MSFT_SqlServerEndpoint\Test-TargetResource' -Tag 'Test' { BeforeEach { $testParameters = $defaultParameters.Clone() @@ -335,7 +335,7 @@ try Assert-VerifiableMock } - Describe 'MSFT_xSQLServerEndpoint\Set-TargetResource' -Tag 'Set' { + Describe 'MSFT_SqlServerEndpoint\Set-TargetResource' -Tag 'Set' { BeforeEach { $testParameters = $defaultParameters.Clone() diff --git a/Tests/Unit/MSFT_xSQLServerEndpointPermission.Tests.ps1 b/Tests/Unit/MSFT_SqlServerEndpointPermission.Tests.ps1 similarity index 97% rename from Tests/Unit/MSFT_xSQLServerEndpointPermission.Tests.ps1 rename to Tests/Unit/MSFT_SqlServerEndpointPermission.Tests.ps1 index bf6929a5c..f33833ac0 100644 --- a/Tests/Unit/MSFT_xSQLServerEndpointPermission.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerEndpointPermission.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerEndpointPermission' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlServerEndpointPermission' #region HEADER @@ -91,7 +91,7 @@ try Principal = $mockPrincipal } - Describe 'MSFT_xSQLServerEndpointPermission\Get-TargetResource' -Tag 'Get' { + Describe 'MSFT_SqlServerEndpointPermission\Get-TargetResource' -Tag 'Get' { BeforeEach { $testParameters = $defaultParameters.Clone() @@ -167,7 +167,7 @@ try Assert-VerifiableMock } - Describe 'MSFT_xSQLServerEndpointPermission\Test-TargetResource' -Tag 'Test' { + Describe 'MSFT_SqlServerEndpointPermission\Test-TargetResource' -Tag 'Test' { BeforeEach { $testParameters = $defaultParameters.Clone() @@ -229,7 +229,7 @@ try Assert-VerifiableMock } - Describe 'MSFT_xSQLServerEndpointPermission\Set-TargetResource' -Tag 'Set' { + Describe 'MSFT_SqlServerEndpointPermission\Set-TargetResource' -Tag 'Set' { BeforeEach { $testParameters = $defaultParameters.Clone() diff --git a/Tests/Unit/MSFT_xSQLServerEndpointState.Tests.ps1 b/Tests/Unit/MSFT_SqlServerEndpointState.Tests.ps1 similarity index 97% rename from Tests/Unit/MSFT_xSQLServerEndpointState.Tests.ps1 rename to Tests/Unit/MSFT_SqlServerEndpointState.Tests.ps1 index 56cb6e342..a28fae2b0 100644 --- a/Tests/Unit/MSFT_xSQLServerEndpointState.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerEndpointState.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerEndpointState' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlServerEndpointState' #region HEADER @@ -68,7 +68,7 @@ try #endregion Pester Test Initialization - Describe 'MSFT_xSQLServerEndpointState\Get-TargetResource' -Tag Get { + Describe 'MSFT_SqlServerEndpointState\Get-TargetResource' -Tag Get { BeforeEach { $testParameters = $defaultParameters.Clone() @@ -180,7 +180,7 @@ try Assert-VerifiableMock } - Describe 'MSFT_xSQLServerEndpointState\Test-TargetResource' -Tag Test { + Describe 'MSFT_SqlServerEndpointState\Test-TargetResource' -Tag Test { BeforeEach { $testParameters = $defaultParameters.Clone() @@ -258,7 +258,7 @@ try Assert-VerifiableMock } - Describe 'MSFT_xSQLServerEndpointState\Set-TargetResource' -Tag Set { + Describe 'MSFT_SqlServerEndpointState\Set-TargetResource' -Tag Set { BeforeEach { $testParameters = $defaultParameters.Clone() diff --git a/Tests/Unit/MSFT_xSQLServerLogin.Tests.ps1 b/Tests/Unit/MSFT_SqlServerLogin.Tests.ps1 similarity index 99% rename from Tests/Unit/MSFT_xSQLServerLogin.Tests.ps1 rename to Tests/Unit/MSFT_SqlServerLogin.Tests.ps1 index a7b335256..f530fd467 100644 --- a/Tests/Unit/MSFT_xSQLServerLogin.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerLogin.Tests.ps1 @@ -2,8 +2,8 @@ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingConvertToSecureStringWithPlainText', '')] param() -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerLogin' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlServerLogin' #region HEADER @@ -206,7 +206,7 @@ try #endregion Pester Test Initialization - Describe 'MSFT_xSQLServerLogin\Get-TargetResource' { + Describe 'MSFT_SqlServerLogin\Get-TargetResource' { Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable Context 'When the login is Absent' { @@ -278,7 +278,7 @@ try } } - Describe 'MSFT_xSQLServerLogin\Test-TargetResource' { + Describe 'MSFT_SqlServerLogin\Test-TargetResource' { Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable Context 'When the desired state is Absent' { @@ -504,7 +504,7 @@ try } } - Describe 'MSFT_xSQLServerLogin\Set-TargetResource' { + Describe 'MSFT_SqlServerLogin\Set-TargetResource' { Mock -CommandName New-TerminatingError -MockWith { $ErrorType } -ModuleName $script:DSCResourceName Mock -CommandName Update-SQLServerLogin -MockWith {} -ModuleName $script:DSCResourceName Mock -CommandName New-SQLServerLogin -MockWith {} -ModuleName $script:DSCResourceName @@ -906,7 +906,7 @@ try } } - Describe 'MSFT_xSQLServerLogin\Update-SQLServerLogin' { + Describe 'MSFT_SqlServerLogin\Update-SQLServerLogin' { Mock -CommandName New-TerminatingError -MockWith { $ErrorType } -ModuleName $script:DSCResourceName Context 'When the Login is altered' { @@ -927,7 +927,7 @@ try } } - Describe 'MSFT_xSQLServerLogin\New-SQLServerLogin' { + Describe 'MSFT_SqlServerLogin\New-SQLServerLogin' { Mock -CommandName New-TerminatingError -MockWith { $ErrorType } -ModuleName $script:DSCResourceName Context 'When the Login is created' { @@ -1002,7 +1002,7 @@ try } } - Describe 'MSFT_xSQLServerLogin\Remove-SQLServerLogin' { + Describe 'MSFT_SqlServerLogin\Remove-SQLServerLogin' { Mock -CommandName New-TerminatingError -MockWith { $ErrorType } -ModuleName $script:DSCResourceName Context 'When the Login is dropped' { @@ -1023,7 +1023,7 @@ try } } - Describe 'MSFT_xSQLServerLogin\Set-SQLServerLoginPassword' { + Describe 'MSFT_SqlServerLogin\Set-SQLServerLoginPassword' { Mock -CommandName New-TerminatingError -MockWith { $ErrorType } -ModuleName $script:DSCResourceName Context 'When the password is set on an existing login' { diff --git a/Tests/Unit/MSFT_xSQLServerMaxDop.Tests.ps1 b/Tests/Unit/MSFT_SqlServerMaxDop.Tests.ps1 similarity index 98% rename from Tests/Unit/MSFT_xSQLServerMaxDop.Tests.ps1 rename to Tests/Unit/MSFT_SqlServerMaxDop.Tests.ps1 index ca3092649..6eff03832 100644 --- a/Tests/Unit/MSFT_xSQLServerMaxDop.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerMaxDop.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerMaxDop' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlServerMaxDop' #region HEADER @@ -98,7 +98,7 @@ try #endregion - Describe "MSFT_xSQLServerMaxDop\Get-TargetResource" -Tag 'Get'{ + Describe "MSFT_SqlServerMaxDop\Get-TargetResource" -Tag 'Get'{ Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable Mock -CommandName Test-ActiveNode -MockWith { return $mockProcessOnlyOnActiveNode } -Verifiable @@ -128,7 +128,7 @@ try Assert-VerifiableMock } - Describe "MSFT_xSQLServerMaxDop\Test-TargetResource" -Tag 'Test'{ + Describe "MSFT_SqlServerMaxDop\Test-TargetResource" -Tag 'Test'{ BeforeEach { Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable @@ -378,7 +378,7 @@ try Assert-VerifiableMock } - Describe "MSFT_xSQLServerMaxDop\Set-TargetResource" -Tag 'Set'{ + Describe "MSFT_SqlServerMaxDop\Set-TargetResource" -Tag 'Set'{ BeforeEach { Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable diff --git a/Tests/Unit/MSFT_xSQLServerMemory.Tests.ps1 b/Tests/Unit/MSFT_SqlServerMemory.Tests.ps1 similarity index 96% rename from Tests/Unit/MSFT_xSQLServerMemory.Tests.ps1 rename to Tests/Unit/MSFT_SqlServerMemory.Tests.ps1 index e54c72156..f3c23cb8e 100644 --- a/Tests/Unit/MSFT_xSQLServerMemory.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerMemory.Tests.ps1 @@ -1,778 +1,778 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerMemory' - -#region HEADER - -# Unit Test Template Version: 1.2.0 -$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) -if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` - (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) -{ - & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) -} - -Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force - -# Loading mocked classes -Add-Type -Path ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stubs ) -ChildPath SMO.cs ) - -$TestEnvironment = Initialize-TestEnvironment ` - -DSCModuleName $script:DSCModuleName ` - -DSCResourceName $script:DSCResourceName ` - -TestType Unit - -#endregion HEADER - -function Invoke-TestSetup { -} - -function Invoke-TestCleanup { - Restore-TestEnvironment -TestEnvironment $TestEnvironment -} - -# Begin Testing -try -{ - Invoke-TestSetup - - InModuleScope $script:DSCResourceName { - $mockSQLServerName = 'localhost' - $mockSQLServerInstanceName = 'MSSQLSERVER' - $mockMinServerMemory = 2048 - $mockMaxServerMemory = 10300 - $mockPhysicalMemoryCapacity = 8589934592 - $mockExpectedMinMemoryForAlterMethod = 0 - $mockExpectedMaxMemoryForAlterMethod = 2147483647 - $mockTestActiveNode = $true - - # Default parameters that are used for the It-blocks - $mockDefaultParameters = @{ - SQLInstanceName = $mockSQLServerInstanceName - SQLServer = $mockSQLServerName - } - - #region Function mocks - - $mockConnectSQL = { - return @( - ( - # New-Object Object | - New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server | - Add-Member -MemberType NoteProperty -Name InstanceName -Value $mockSQLServerInstanceName -PassThru -Force | - Add-Member -MemberType NoteProperty -Name ComputerNamePhysicalNetBIOS -Value $mockSQLServerName -PassThru -Force | - Add-Member -MemberType ScriptProperty -Name Configuration -Value { - return @( ( New-Object Object | - Add-Member -MemberType ScriptProperty -Name MinServerMemory -Value { - return @( ( New-Object Object | - Add-Member -MemberType NoteProperty -Name DisplayName -Value 'min server memory (MB)' -PassThru | - Add-Member -MemberType NoteProperty -Name Description -Value 'Minimum size of server memory (MB)' -PassThru | - Add-Member -MemberType NoteProperty -Name RunValue -Value $mockMinServerMemory -PassThru | - Add-Member -MemberType NoteProperty -Name ConfigValue -Value $mockMinServerMemory -PassThru -Force - ) ) - } -PassThru | - Add-Member -MemberType ScriptProperty -Name MaxServerMemory -Value { - return @( ( New-Object Object | - Add-Member -MemberType NoteProperty -Name DisplayName -Value 'max server memory (MB)' -PassThru | - Add-Member -MemberType NoteProperty -Name Description -Value 'Maximum size of server memory (MB)' -PassThru | - Add-Member -MemberType NoteProperty -Name RunValue -Value $mockMaxServerMemory -PassThru | - Add-Member -MemberType NoteProperty -Name ConfigValue -Value $mockMaxServerMemory -PassThru -Force - ) ) - } -PassThru -Force - ) ) - } -PassThru -Force | - Add-Member -MemberType ScriptMethod -Name Alter -Value { - if ( $this.Configuration.MinServerMemory.ConfigValue -ne $mockExpectedMinMemoryForAlterMethod ) - { - throw "Called mocked Alter() method without setting the right minimum server memory. Expected '{0}'. But was '{1}'." -f $mockExpectedMinMemoryForAlterMethod, $this.Configuration.MinServerMemory.ConfigValue - } - if ( $this.Configuration.MaxServerMemory.ConfigValue -ne $mockExpectedMaxMemoryForAlterMethod ) - { - throw "Called mocked Alter() method without setting the right maximum server memory. Expected '{0}'. But was '{1}'." -f $mockExpectedMaxMemoryForAlterMethod, $this.Configuration.MaxServerMemory.ConfigValue - } - } -PassThru -Force - ) - ) - } - - #endregion - - Describe "MSFT_xSQLServerMemory\Get-TargetResource" -Tag 'Get'{ - Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable - Mock -CommandName Test-ActiveNode -MockWith { return $mockTestActiveNode } -Verifiable - - Context 'When the system is either in the desired state or not in the desired state' { - $testParameters = $mockDefaultParameters - - $result = Get-TargetResource @testParameters - - It 'Should return the current value for MinMemory' { - $result.MinMemory | Should -Be 2048 - } - - It 'Should return the current value for MaxMemory' { - $result.MaxMemory | Should -Be 10300 - } - - It 'Should return the same values as passed as parameters' { - $result.SQLServer | Should -Be $testParameters.SQLServer - $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should call the mock function Test-ActiveNode' { - Assert-MockCalled Test-ActiveNode -Exactly -Times 1 -Scope Context - } - } - - Assert-VerifiableMock - } - - Describe "MSFT_xSQLServerMemory\Test-TargetResource" -Tag 'Test'{ - Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable - - Mock -CommandName Get-CimInstance -MockWith { - throw 'Mocked function Get-CimInstance was called with the wrong set of parameter filters.' - } - - Mock -CommandName Get-CimInstance -MockWith { - $mockGetCimInstanceMem = @() - - $mockGetCimInstanceMem += New-Object -TypeName psobject -Property @{ - Name = 'Physical Memory' - Tag = 'Physical Memory 0' - Capacity = 8589934592 - } - - $mockGetCimInstanceMem += New-Object -TypeName psobject -Property @{ - Name = 'Physical Memory' - Tag = 'Physical Memory 1' - Capacity = 8589934592 - } - - $mockGetCimInstanceMem - } -ParameterFilter { $ClassName -eq 'Win32_PhysicalMemory' } -Verifiable - - Mock -CommandName Get-CimInstance -MockWith { - $mockGetCimInstanceProc = [PSCustomObject]@{ - NumberOfCores = 2 - } - - $mockGetCimInstanceProc - } -ParameterFilter { $ClassName -eq 'Win32_Processor' } -Verifiable - - Mock -CommandName Get-CimInstance -MockWith { - $mockGetCimInstanceOS = [PSCustomObject]@{ - OSArchitecture = '64-bit' - } - - $mockGetCimInstanceOS - } -ParameterFilter { $ClassName -eq 'Win32_operatingsystem' } -Verifiable - - Mock -CommandName Test-ActiveNode -MockWith { return $mockTestActiveNode } -Verifiable - - Context 'When the system is not in the desired state and DynamicAlloc is set to false' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - MinMemory = 1024 - MaxMemory = 8192 - DynamicAlloc = $false - } - - It 'Should return the state as false when desired MinMemory and MaxMemory are not present' { - $result = Test-TargetResource @testParameters - $result | Should -Be $false - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should not call the mock function Get-CimInstance' { - Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context - } - } - - Context 'When the system is not in the desired state and DynamicAlloc is set to false' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - MaxMemory = 8192 - DynamicAlloc = $false - } - - It 'Should return the state as false when desired MaxMemory is not present' { - $result = Test-TargetResource @testParameters - $result | Should -Be $false - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should not call the mock function Get-CimInstance' { - Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context - } - } - - Context 'When the system is in the desired state and DynamicAlloc is set to false' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - MinMemory = 0 - MaxMemory = 10300 - DynamicAlloc = $false - } - - It 'Should return the state as true when desired MinMemory and MaxMemory are present' { - $result = Test-TargetResource @testParameters - $result | Should -Be $true - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should not call the mock function Get-CimInstance' { - Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context - } - } - - Context 'When the MaxMemory parameter is not null and DynamicAlloc is set to true' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - MaxMemory = 8192 - DynamicAlloc = $true - Ensure = 'Present' - } - - It 'Should throw the correct error' { - { Test-TargetResource @testParameters } | Should -Throw 'The parameter MaxMemory must be null when DynamicAlloc is set to true.' - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should not call the mock function Get-CimInstance' { - Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context - } - } - - Context 'When the MaxMemory parameter is null and DynamicAlloc is set to false' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - DynamicAlloc = $false - Ensure = 'Present' - } - - It 'Should throw the correct error' { - {Test-TargetResource @testParameters } | Should -Throw 'The parameter MaxMemory must not be null when DynamicAlloc is set to false.' - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should not call the mock function Get-CimInstance' { - Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context - } - } - - Context 'When the system is not in the desired state and DynamicAlloc is set to true' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - DynamicAlloc = $true - } - - It 'Should return the state as false when desired MinMemory and MaxMemory are not present' { - $result = Test-TargetResource @testParameters - $result | Should -Be $false - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_PhysicalMemory' { - Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { - $ClassName -eq 'Win32_PhysicalMemory' - } -Scope Context - } - - It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_Processor' { - Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { - $ClassName -eq 'Win32_Processor' - } -Scope Context - } - - It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_operatingsystem' { - Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { - $ClassName -eq 'Win32_operatingsystem' - } -Scope Context - } - } - - Context 'When the system is not in the desired state, DynamicAlloc is set to true and ProcessOnlyOnActiveNode is set to true' { - AfterAll { - $mockTestActiveNode = $true - } - - BeforeAll { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - DynamicAlloc = $true - ProcessOnlyOnActiveNode = $true - } - - $mockTestActiveNode = $false - } - - It 'Should return the state as true' { - $result = Test-TargetResource @testParameters - $result | Should -Be $true - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should not call the mock function Get-CimInstance with ClassName equal to Win32_PhysicalMemory' { - Assert-MockCalled Get-CimInstance -Exactly -Times 0 -ParameterFilter { - $ClassName -eq 'Win32_PhysicalMemory' - } -Scope Context - } - - It 'Should not call the mock function Get-CimInstance with ClassName equal to Win32_Processor' { - Assert-MockCalled Get-CimInstance -Exactly -Times 0 -ParameterFilter { - $ClassName -eq 'Win32_Processor' - } -Scope Context - } - - It 'Should not call the mock function Get-CimInstance with ClassName equal to Win32_operatingsystem' { - Assert-MockCalled Get-CimInstance -Exactly -Times 0 -ParameterFilter { - $ClassName -eq 'Win32_operatingsystem' - } -Scope Context - } - } - - $mockMinServerMemory = 0 - $mockMaxServerMemory = 12083 - - Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable - - Context 'When the system is in the desired state and DynamicAlloc is set to true' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - DynamicAlloc = $true - } - - It 'Should return the state as true when desired MinMemory and MaxMemory are present' { - $result = Test-TargetResource @testParameters - $result | Should -Be $true - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_PhysicalMemory' { - Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { - $ClassName -eq 'Win32_PhysicalMemory' - } -Scope Context - } - - It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_Processor' { - Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { - $ClassName -eq 'Win32_Processor' - } -Scope Context - } - - It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_operatingsystem' { - Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { - $ClassName -eq 'Win32_operatingsystem' - } -Scope Context - } - } - - $mockMinServerMemory = 1024 - $mockMaxServerMemory = 8192 - - Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable - - Context 'When the system is not in the desired state and Ensure is set to Absent' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Absent' - } - - It 'Should return the state as false when desired MinMemory and MaxMemory are not set to the default values' { - $result = Test-TargetResource @testParameters - $result | Should -Be $false - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should not call the mock function Get-CimInstance' { - Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context - } - } - - $mockMinServerMemory = 0 - $mockMaxServerMemory = 2147483647 - - Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable - - Context 'When the system is in the desired state and Ensure is set to Absent' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Absent' - } - - It 'Should return the state as true when desired MinMemory and MaxMemory are present' { - $result = Test-TargetResource @testParameters - $result | Should -Be $true - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should not call the mock function Get-CimInstance' { - Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context - } - } - - # This is regression test for issue #576 - Context 'When the system is in the desired state and SQLServer is not set' { - $testParameters = $mockDefaultParameters - $testParameters.Remove('SQLServer') - $testParameters += @{ - Ensure = 'Absent' - } - - It 'Should not throw an error' { - { Test-TargetResource @testParameters } | Should -Not -Throw - } - } - - Assert-VerifiableMock - } - - Describe "MSFT_xSQLServerMemory\Set-TargetResource" -Tag 'Set' { - $mockMinServerMemory = 0 - $mockMaxServerMemory = 2147483647 - - Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable - - Mock -CommandName Get-CimInstance -MockWith { - throw 'Mocked function Get-CimInstance was called with the wrong set of parameter filters.' - } - - Mock -CommandName Get-CimInstance -MockWith { - $mockGetCimInstanceMem = @() - - $mockGetCimInstanceMem += New-Object -TypeName psobject -Property @{ - Name = 'Physical Memory' - Tag = 'Physical Memory 0' - Capacity = 17179869184 - } - - $mockGetCimInstanceMem += New-Object -TypeName psobject -Property @{ - Name = 'Physical Memory' - Tag = 'Physical Memory 1' - Capacity = 17179869184 - } - - $mockGetCimInstanceMem - } -ParameterFilter { $ClassName -eq 'Win32_PhysicalMemory' } -Verifiable - - Mock -CommandName Get-CimInstance -MockWith { - $mockGetCimInstanceProc = [PSCustomObject]@{ - NumberOfCores = 6 - } - - $mockGetCimInstanceProc - } -ParameterFilter { $ClassName -eq 'Win32_Processor' } -Verifiable - - Mock -CommandName Get-CimInstance -MockWith { - $mockGetCimInstanceOS = [PSCustomObject]@{ - OSArchitecture = 'IA64-bit' - } - - $mockGetCimInstanceOS - } -ParameterFilter { $ClassName -eq 'Win32_operatingsystem' } -Verifiable - - Context 'When the MaxMemory parameter is not null and DynamicAlloc is set to true' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - MaxMemory = 8192 - DynamicAlloc = $true - Ensure = 'Present' - } - - It 'Should throw the correct error' { - { Set-TargetResource @testParameters } | Should -Throw 'The parameter MaxMemory must be null when DynamicAlloc is set to true.' - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should not call the mock function Get-CimInstance' { - Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context - } - } - - Context 'When the MaxMemory parameter is null and DynamicAlloc is set to false' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - DynamicAlloc = $false - Ensure = 'Present' - } - - It 'Should throw the correct error' { - { Set-TargetResource @testParameters } | Should -Throw 'The parameter MaxMemory must not be null when DynamicAlloc is set to false.' - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should not call the mock function Get-CimInstance' { - Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context - } - } - - Context 'When the system is not in the desired state and Ensure is set to Absent' { - $mockExpectedMinMemoryForAlterMethod = 0 - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Absent' - } - - It 'Should set the MinMemory and MaxMemory to the default values' { - { Set-TargetResource @testParameters } | Should -Not -Throw - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should not call the mock function Get-CimInstance' { - Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context - } - } - - Context 'When the system is not in the desired state and Ensure is set to Present, and DynamicAlloc is set to false' { - $mockMinServerMemory = 1024 - $mockMaxServerMemory = 8192 - - Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable - - $mockExpectedMinMemoryForAlterMethod = 1024 - $mockExpectedMaxMemoryForAlterMethod = 8192 - $testParameters = $mockDefaultParameters - $testParameters += @{ - MaxMemory = 8192 - MinMemory = 1024 - DynamicAlloc = $false - Ensure = 'Present' - } - - It 'Should set the MinMemory and MaxMemory to the correct values when Ensure parameter is set to Present and DynamicAlloc is set to false' { - { Set-TargetResource @testParameters } | Should -Not -Throw - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should not call the mock function Get-CimInstance' { - Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context - } - } - - Context 'When the system (OS IA64-bit) is not in the desired state and Ensure is set to Present, and DynamicAlloc is set to true' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - DynamicAlloc = $true - Ensure = 'Present' - MinMemory = 2048 - } - - It 'Should set the MaxMemory to the correct values when Ensure parameter is set to Present and DynamicAlloc is set to true' { - { Set-TargetResource @testParameters } | Should -Not -Throw - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_PhysicalMemory' { - Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { - $ClassName -eq 'Win32_PhysicalMemory' - } -Scope Context - } - - It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_Processor' { - Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { - $ClassName -eq 'Win32_Processor' - } -Scope Context - } - - It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_operatingsystem' { - Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { - $ClassName -eq 'Win32_operatingsystem' - } -Scope Context - } - } - - Mock -CommandName Get-CimInstance -MockWith { - $mockGetCimInstanceOS = [PSCustomObject]@{ - OSArchitecture = '32-bit' - } - - $mockGetCimInstanceOS - } -ParameterFilter { $ClassName -eq 'Win32_operatingsystem' } -Verifiable - - Context 'When the system (OS 32-bit) is not in the desired state and Ensure is set to Present, and DynamicAlloc is set to true' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - DynamicAlloc = $true - Ensure = 'Present' - } - - It 'Should set the MaxMemory to the correct values when Ensure parameter is set to Present and DynamicAlloc is set to true' { - { Set-TargetResource @testParameters } | Should -Not -Throw - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_PhysicalMemory' { - Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { - $ClassName -eq 'Win32_PhysicalMemory' - } -Scope Context - } - - It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_Processor' { - Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { - $ClassName -eq 'Win32_Processor' - } -Scope Context - } - - It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_operatingsystem' { - Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { - $ClassName -eq 'Win32_operatingsystem' - } -Scope Context - } - } - - Mock -CommandName Connect-SQL -MockWith { - $mockSqlServerObject = [PSCustomObject]@{ - InstanceName = $mockSQLServerInstanceName - ComputerNamePhysicalNetBIOS = $mockSQLServerName - Configuration = @{ - MinServerMemory = @{ - DisplayName = 'min server memory (MB)' - Description = 'Minimum size of server memory (MB)' - RunValue = 0 - ConfigValue = 0 - } - MaxServerMemory = @{ - DisplayName = 'max server memory (MB)' - Description = 'Maximum size of server memory (MB)' - RunValue = 10300 - ConfigValue = 10300 - } - } - } - - # Add the Alter method - $mockSqlServerObject | Add-Member -MemberType ScriptMethod -Name Alter -Value { - throw 'Mock Alter Method was called with invalid operation.' - } - - $mockSqlServerObject - } -Verifiable - - Context 'When the desired MinMemory and MaxMemory fails to be set' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - MaxMemory = 8192 - MinMemory = 1024 - DynamicAlloc = $false - Ensure = 'Present' - } - - It 'Should throw the correct error' { - { Set-TargetResource @testParameters } | Should -Throw ("Failed to alter the server configuration memory for $($env:COMPUTERNAME)" + "\" +` - "$mockSQLServerInstanceName. InnerException: Exception calling ""Alter"" with ""0"" argument(s): " + ` - """Mock Alter Method was called with invalid operation.""") - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should not call the mock function Get-CimInstance' { - Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context - } - } - - Mock -CommandName Get-CimInstance -MockWith { - throw - } -ParameterFilter { $ClassName -eq 'Win32_operatingsystem' } -Verifiable - - Context 'When the Get-SqlDscDynamicMaxMemory fails to calculate the MaxMemory' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - DynamicAlloc = $true - Ensure = 'Present' - } - - It 'Should throw the correct error' { - { Set-TargetResource @testParameters } | Should -Throw 'Failed to calculate dynamically the maximum memory.' - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_PhysicalMemory' { - Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { - $ClassName -eq 'Win32_PhysicalMemory' - } -Scope Context - } - - It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_Processor' { - Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { - $ClassName -eq 'Win32_Processor' - } -Scope Context - } - - It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_operatingsystem' { - Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { - $ClassName -eq 'Win32_operatingsystem' - } -Scope Context - } - } - - Assert-VerifiableMock - } - } -} -finally -{ - Invoke-TestCleanup -} +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlServerMemory' + +#region HEADER + +# Unit Test Template Version: 1.2.0 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) +} + +Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force + +# Loading mocked classes +Add-Type -Path ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stubs ) -ChildPath SMO.cs ) + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $script:DSCModuleName ` + -DSCResourceName $script:DSCResourceName ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup { +} + +function Invoke-TestCleanup { + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope $script:DSCResourceName { + $mockSQLServerName = 'localhost' + $mockSQLServerInstanceName = 'MSSQLSERVER' + $mockMinServerMemory = 2048 + $mockMaxServerMemory = 10300 + $mockPhysicalMemoryCapacity = 8589934592 + $mockExpectedMinMemoryForAlterMethod = 0 + $mockExpectedMaxMemoryForAlterMethod = 2147483647 + $mockTestActiveNode = $true + + # Default parameters that are used for the It-blocks + $mockDefaultParameters = @{ + SQLInstanceName = $mockSQLServerInstanceName + SQLServer = $mockSQLServerName + } + + #region Function mocks + + $mockConnectSQL = { + return @( + ( + # New-Object Object | + New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server | + Add-Member -MemberType NoteProperty -Name InstanceName -Value $mockSQLServerInstanceName -PassThru -Force | + Add-Member -MemberType NoteProperty -Name ComputerNamePhysicalNetBIOS -Value $mockSQLServerName -PassThru -Force | + Add-Member -MemberType ScriptProperty -Name Configuration -Value { + return @( ( New-Object Object | + Add-Member -MemberType ScriptProperty -Name MinServerMemory -Value { + return @( ( New-Object Object | + Add-Member -MemberType NoteProperty -Name DisplayName -Value 'min server memory (MB)' -PassThru | + Add-Member -MemberType NoteProperty -Name Description -Value 'Minimum size of server memory (MB)' -PassThru | + Add-Member -MemberType NoteProperty -Name RunValue -Value $mockMinServerMemory -PassThru | + Add-Member -MemberType NoteProperty -Name ConfigValue -Value $mockMinServerMemory -PassThru -Force + ) ) + } -PassThru | + Add-Member -MemberType ScriptProperty -Name MaxServerMemory -Value { + return @( ( New-Object Object | + Add-Member -MemberType NoteProperty -Name DisplayName -Value 'max server memory (MB)' -PassThru | + Add-Member -MemberType NoteProperty -Name Description -Value 'Maximum size of server memory (MB)' -PassThru | + Add-Member -MemberType NoteProperty -Name RunValue -Value $mockMaxServerMemory -PassThru | + Add-Member -MemberType NoteProperty -Name ConfigValue -Value $mockMaxServerMemory -PassThru -Force + ) ) + } -PassThru -Force + ) ) + } -PassThru -Force | + Add-Member -MemberType ScriptMethod -Name Alter -Value { + if ( $this.Configuration.MinServerMemory.ConfigValue -ne $mockExpectedMinMemoryForAlterMethod ) + { + throw "Called mocked Alter() method without setting the right minimum server memory. Expected '{0}'. But was '{1}'." -f $mockExpectedMinMemoryForAlterMethod, $this.Configuration.MinServerMemory.ConfigValue + } + if ( $this.Configuration.MaxServerMemory.ConfigValue -ne $mockExpectedMaxMemoryForAlterMethod ) + { + throw "Called mocked Alter() method without setting the right maximum server memory. Expected '{0}'. But was '{1}'." -f $mockExpectedMaxMemoryForAlterMethod, $this.Configuration.MaxServerMemory.ConfigValue + } + } -PassThru -Force + ) + ) + } + + #endregion + + Describe "MSFT_SqlServerMemory\Get-TargetResource" -Tag 'Get'{ + Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable + Mock -CommandName Test-ActiveNode -MockWith { return $mockTestActiveNode } -Verifiable + + Context 'When the system is either in the desired state or not in the desired state' { + $testParameters = $mockDefaultParameters + + $result = Get-TargetResource @testParameters + + It 'Should return the current value for MinMemory' { + $result.MinMemory | Should -Be 2048 + } + + It 'Should return the current value for MaxMemory' { + $result.MaxMemory | Should -Be 10300 + } + + It 'Should return the same values as passed as parameters' { + $result.SQLServer | Should -Be $testParameters.SQLServer + $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should call the mock function Test-ActiveNode' { + Assert-MockCalled Test-ActiveNode -Exactly -Times 1 -Scope Context + } + } + + Assert-VerifiableMock + } + + Describe "MSFT_SqlServerMemory\Test-TargetResource" -Tag 'Test'{ + Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable + + Mock -CommandName Get-CimInstance -MockWith { + throw 'Mocked function Get-CimInstance was called with the wrong set of parameter filters.' + } + + Mock -CommandName Get-CimInstance -MockWith { + $mockGetCimInstanceMem = @() + + $mockGetCimInstanceMem += New-Object -TypeName psobject -Property @{ + Name = 'Physical Memory' + Tag = 'Physical Memory 0' + Capacity = 8589934592 + } + + $mockGetCimInstanceMem += New-Object -TypeName psobject -Property @{ + Name = 'Physical Memory' + Tag = 'Physical Memory 1' + Capacity = 8589934592 + } + + $mockGetCimInstanceMem + } -ParameterFilter { $ClassName -eq 'Win32_PhysicalMemory' } -Verifiable + + Mock -CommandName Get-CimInstance -MockWith { + $mockGetCimInstanceProc = [PSCustomObject]@{ + NumberOfCores = 2 + } + + $mockGetCimInstanceProc + } -ParameterFilter { $ClassName -eq 'Win32_Processor' } -Verifiable + + Mock -CommandName Get-CimInstance -MockWith { + $mockGetCimInstanceOS = [PSCustomObject]@{ + OSArchitecture = '64-bit' + } + + $mockGetCimInstanceOS + } -ParameterFilter { $ClassName -eq 'Win32_operatingsystem' } -Verifiable + + Mock -CommandName Test-ActiveNode -MockWith { return $mockTestActiveNode } -Verifiable + + Context 'When the system is not in the desired state and DynamicAlloc is set to false' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + MinMemory = 1024 + MaxMemory = 8192 + DynamicAlloc = $false + } + + It 'Should return the state as false when desired MinMemory and MaxMemory are not present' { + $result = Test-TargetResource @testParameters + $result | Should -Be $false + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should not call the mock function Get-CimInstance' { + Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context + } + } + + Context 'When the system is not in the desired state and DynamicAlloc is set to false' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + MaxMemory = 8192 + DynamicAlloc = $false + } + + It 'Should return the state as false when desired MaxMemory is not present' { + $result = Test-TargetResource @testParameters + $result | Should -Be $false + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should not call the mock function Get-CimInstance' { + Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context + } + } + + Context 'When the system is in the desired state and DynamicAlloc is set to false' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + MinMemory = 0 + MaxMemory = 10300 + DynamicAlloc = $false + } + + It 'Should return the state as true when desired MinMemory and MaxMemory are present' { + $result = Test-TargetResource @testParameters + $result | Should -Be $true + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should not call the mock function Get-CimInstance' { + Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context + } + } + + Context 'When the MaxMemory parameter is not null and DynamicAlloc is set to true' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + MaxMemory = 8192 + DynamicAlloc = $true + Ensure = 'Present' + } + + It 'Should throw the correct error' { + { Test-TargetResource @testParameters } | Should -Throw 'The parameter MaxMemory must be null when DynamicAlloc is set to true.' + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should not call the mock function Get-CimInstance' { + Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context + } + } + + Context 'When the MaxMemory parameter is null and DynamicAlloc is set to false' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + DynamicAlloc = $false + Ensure = 'Present' + } + + It 'Should throw the correct error' { + {Test-TargetResource @testParameters } | Should -Throw 'The parameter MaxMemory must not be null when DynamicAlloc is set to false.' + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should not call the mock function Get-CimInstance' { + Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context + } + } + + Context 'When the system is not in the desired state and DynamicAlloc is set to true' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + DynamicAlloc = $true + } + + It 'Should return the state as false when desired MinMemory and MaxMemory are not present' { + $result = Test-TargetResource @testParameters + $result | Should -Be $false + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_PhysicalMemory' { + Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { + $ClassName -eq 'Win32_PhysicalMemory' + } -Scope Context + } + + It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_Processor' { + Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { + $ClassName -eq 'Win32_Processor' + } -Scope Context + } + + It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_operatingsystem' { + Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { + $ClassName -eq 'Win32_operatingsystem' + } -Scope Context + } + } + + Context 'When the system is not in the desired state, DynamicAlloc is set to true and ProcessOnlyOnActiveNode is set to true' { + AfterAll { + $mockTestActiveNode = $true + } + + BeforeAll { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + DynamicAlloc = $true + ProcessOnlyOnActiveNode = $true + } + + $mockTestActiveNode = $false + } + + It 'Should return the state as true' { + $result = Test-TargetResource @testParameters + $result | Should -Be $true + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should not call the mock function Get-CimInstance with ClassName equal to Win32_PhysicalMemory' { + Assert-MockCalled Get-CimInstance -Exactly -Times 0 -ParameterFilter { + $ClassName -eq 'Win32_PhysicalMemory' + } -Scope Context + } + + It 'Should not call the mock function Get-CimInstance with ClassName equal to Win32_Processor' { + Assert-MockCalled Get-CimInstance -Exactly -Times 0 -ParameterFilter { + $ClassName -eq 'Win32_Processor' + } -Scope Context + } + + It 'Should not call the mock function Get-CimInstance with ClassName equal to Win32_operatingsystem' { + Assert-MockCalled Get-CimInstance -Exactly -Times 0 -ParameterFilter { + $ClassName -eq 'Win32_operatingsystem' + } -Scope Context + } + } + + $mockMinServerMemory = 0 + $mockMaxServerMemory = 12083 + + Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable + + Context 'When the system is in the desired state and DynamicAlloc is set to true' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + DynamicAlloc = $true + } + + It 'Should return the state as true when desired MinMemory and MaxMemory are present' { + $result = Test-TargetResource @testParameters + $result | Should -Be $true + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_PhysicalMemory' { + Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { + $ClassName -eq 'Win32_PhysicalMemory' + } -Scope Context + } + + It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_Processor' { + Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { + $ClassName -eq 'Win32_Processor' + } -Scope Context + } + + It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_operatingsystem' { + Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { + $ClassName -eq 'Win32_operatingsystem' + } -Scope Context + } + } + + $mockMinServerMemory = 1024 + $mockMaxServerMemory = 8192 + + Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable + + Context 'When the system is not in the desired state and Ensure is set to Absent' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Absent' + } + + It 'Should return the state as false when desired MinMemory and MaxMemory are not set to the default values' { + $result = Test-TargetResource @testParameters + $result | Should -Be $false + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should not call the mock function Get-CimInstance' { + Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context + } + } + + $mockMinServerMemory = 0 + $mockMaxServerMemory = 2147483647 + + Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable + + Context 'When the system is in the desired state and Ensure is set to Absent' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Absent' + } + + It 'Should return the state as true when desired MinMemory and MaxMemory are present' { + $result = Test-TargetResource @testParameters + $result | Should -Be $true + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should not call the mock function Get-CimInstance' { + Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context + } + } + + # This is regression test for issue #576 + Context 'When the system is in the desired state and SQLServer is not set' { + $testParameters = $mockDefaultParameters + $testParameters.Remove('SQLServer') + $testParameters += @{ + Ensure = 'Absent' + } + + It 'Should not throw an error' { + { Test-TargetResource @testParameters } | Should -Not -Throw + } + } + + Assert-VerifiableMock + } + + Describe "MSFT_SqlServerMemory\Set-TargetResource" -Tag 'Set' { + $mockMinServerMemory = 0 + $mockMaxServerMemory = 2147483647 + + Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable + + Mock -CommandName Get-CimInstance -MockWith { + throw 'Mocked function Get-CimInstance was called with the wrong set of parameter filters.' + } + + Mock -CommandName Get-CimInstance -MockWith { + $mockGetCimInstanceMem = @() + + $mockGetCimInstanceMem += New-Object -TypeName psobject -Property @{ + Name = 'Physical Memory' + Tag = 'Physical Memory 0' + Capacity = 17179869184 + } + + $mockGetCimInstanceMem += New-Object -TypeName psobject -Property @{ + Name = 'Physical Memory' + Tag = 'Physical Memory 1' + Capacity = 17179869184 + } + + $mockGetCimInstanceMem + } -ParameterFilter { $ClassName -eq 'Win32_PhysicalMemory' } -Verifiable + + Mock -CommandName Get-CimInstance -MockWith { + $mockGetCimInstanceProc = [PSCustomObject]@{ + NumberOfCores = 6 + } + + $mockGetCimInstanceProc + } -ParameterFilter { $ClassName -eq 'Win32_Processor' } -Verifiable + + Mock -CommandName Get-CimInstance -MockWith { + $mockGetCimInstanceOS = [PSCustomObject]@{ + OSArchitecture = 'IA64-bit' + } + + $mockGetCimInstanceOS + } -ParameterFilter { $ClassName -eq 'Win32_operatingsystem' } -Verifiable + + Context 'When the MaxMemory parameter is not null and DynamicAlloc is set to true' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + MaxMemory = 8192 + DynamicAlloc = $true + Ensure = 'Present' + } + + It 'Should throw the correct error' { + { Set-TargetResource @testParameters } | Should -Throw 'The parameter MaxMemory must be null when DynamicAlloc is set to true.' + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should not call the mock function Get-CimInstance' { + Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context + } + } + + Context 'When the MaxMemory parameter is null and DynamicAlloc is set to false' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + DynamicAlloc = $false + Ensure = 'Present' + } + + It 'Should throw the correct error' { + { Set-TargetResource @testParameters } | Should -Throw 'The parameter MaxMemory must not be null when DynamicAlloc is set to false.' + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should not call the mock function Get-CimInstance' { + Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context + } + } + + Context 'When the system is not in the desired state and Ensure is set to Absent' { + $mockExpectedMinMemoryForAlterMethod = 0 + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Absent' + } + + It 'Should set the MinMemory and MaxMemory to the default values' { + { Set-TargetResource @testParameters } | Should -Not -Throw + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should not call the mock function Get-CimInstance' { + Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context + } + } + + Context 'When the system is not in the desired state and Ensure is set to Present, and DynamicAlloc is set to false' { + $mockMinServerMemory = 1024 + $mockMaxServerMemory = 8192 + + Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable + + $mockExpectedMinMemoryForAlterMethod = 1024 + $mockExpectedMaxMemoryForAlterMethod = 8192 + $testParameters = $mockDefaultParameters + $testParameters += @{ + MaxMemory = 8192 + MinMemory = 1024 + DynamicAlloc = $false + Ensure = 'Present' + } + + It 'Should set the MinMemory and MaxMemory to the correct values when Ensure parameter is set to Present and DynamicAlloc is set to false' { + { Set-TargetResource @testParameters } | Should -Not -Throw + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should not call the mock function Get-CimInstance' { + Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context + } + } + + Context 'When the system (OS IA64-bit) is not in the desired state and Ensure is set to Present, and DynamicAlloc is set to true' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + DynamicAlloc = $true + Ensure = 'Present' + MinMemory = 2048 + } + + It 'Should set the MaxMemory to the correct values when Ensure parameter is set to Present and DynamicAlloc is set to true' { + { Set-TargetResource @testParameters } | Should -Not -Throw + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_PhysicalMemory' { + Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { + $ClassName -eq 'Win32_PhysicalMemory' + } -Scope Context + } + + It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_Processor' { + Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { + $ClassName -eq 'Win32_Processor' + } -Scope Context + } + + It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_operatingsystem' { + Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { + $ClassName -eq 'Win32_operatingsystem' + } -Scope Context + } + } + + Mock -CommandName Get-CimInstance -MockWith { + $mockGetCimInstanceOS = [PSCustomObject]@{ + OSArchitecture = '32-bit' + } + + $mockGetCimInstanceOS + } -ParameterFilter { $ClassName -eq 'Win32_operatingsystem' } -Verifiable + + Context 'When the system (OS 32-bit) is not in the desired state and Ensure is set to Present, and DynamicAlloc is set to true' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + DynamicAlloc = $true + Ensure = 'Present' + } + + It 'Should set the MaxMemory to the correct values when Ensure parameter is set to Present and DynamicAlloc is set to true' { + { Set-TargetResource @testParameters } | Should -Not -Throw + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_PhysicalMemory' { + Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { + $ClassName -eq 'Win32_PhysicalMemory' + } -Scope Context + } + + It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_Processor' { + Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { + $ClassName -eq 'Win32_Processor' + } -Scope Context + } + + It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_operatingsystem' { + Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { + $ClassName -eq 'Win32_operatingsystem' + } -Scope Context + } + } + + Mock -CommandName Connect-SQL -MockWith { + $mockSqlServerObject = [PSCustomObject]@{ + InstanceName = $mockSQLServerInstanceName + ComputerNamePhysicalNetBIOS = $mockSQLServerName + Configuration = @{ + MinServerMemory = @{ + DisplayName = 'min server memory (MB)' + Description = 'Minimum size of server memory (MB)' + RunValue = 0 + ConfigValue = 0 + } + MaxServerMemory = @{ + DisplayName = 'max server memory (MB)' + Description = 'Maximum size of server memory (MB)' + RunValue = 10300 + ConfigValue = 10300 + } + } + } + + # Add the Alter method + $mockSqlServerObject | Add-Member -MemberType ScriptMethod -Name Alter -Value { + throw 'Mock Alter Method was called with invalid operation.' + } + + $mockSqlServerObject + } -Verifiable + + Context 'When the desired MinMemory and MaxMemory fails to be set' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + MaxMemory = 8192 + MinMemory = 1024 + DynamicAlloc = $false + Ensure = 'Present' + } + + It 'Should throw the correct error' { + { Set-TargetResource @testParameters } | Should -Throw ("Failed to alter the server configuration memory for $($env:COMPUTERNAME)" + "\" +` + "$mockSQLServerInstanceName. InnerException: Exception calling ""Alter"" with ""0"" argument(s): " + ` + """Mock Alter Method was called with invalid operation.""") + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should not call the mock function Get-CimInstance' { + Assert-MockCalled Get-CimInstance -Exactly -Times 0 -Scope Context + } + } + + Mock -CommandName Get-CimInstance -MockWith { + throw + } -ParameterFilter { $ClassName -eq 'Win32_operatingsystem' } -Verifiable + + Context 'When the Get-SqlDscDynamicMaxMemory fails to calculate the MaxMemory' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + DynamicAlloc = $true + Ensure = 'Present' + } + + It 'Should throw the correct error' { + { Set-TargetResource @testParameters } | Should -Throw 'Failed to calculate dynamically the maximum memory.' + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_PhysicalMemory' { + Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { + $ClassName -eq 'Win32_PhysicalMemory' + } -Scope Context + } + + It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_Processor' { + Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { + $ClassName -eq 'Win32_Processor' + } -Scope Context + } + + It 'Should call the mock function Get-CimInstance with ClassName equal to Win32_operatingsystem' { + Assert-MockCalled Get-CimInstance -Exactly -Times 1 -ParameterFilter { + $ClassName -eq 'Win32_operatingsystem' + } -Scope Context + } + } + + Assert-VerifiableMock + } + } +} +finally +{ + Invoke-TestCleanup +} diff --git a/Tests/Unit/MSFT_xSQLServerNetwork.Tests.ps1 b/Tests/Unit/MSFT_SqlServerNetwork.Tests.ps1 similarity index 98% rename from Tests/Unit/MSFT_xSQLServerNetwork.Tests.ps1 rename to Tests/Unit/MSFT_SqlServerNetwork.Tests.ps1 index 4629075d7..21c5ecc53 100644 --- a/Tests/Unit/MSFT_xSQLServerNetwork.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerNetwork.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerNetwork' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlServerNetwork' #region HEADER @@ -99,7 +99,7 @@ try ProtocolName = $mockTcpProtocolName } - Describe "MSFT_xSQLServerNetwork\Get-TargetResource" -Tag 'Get'{ + Describe "MSFT_SqlServerNetwork\Get-TargetResource" -Tag 'Get'{ BeforeEach { $testParameters = $mockDefaultParameters.Clone() @@ -141,7 +141,7 @@ try Assert-VerifiableMock } - Describe "MSFT_xSQLServerNetwork\Test-TargetResource" -Tag 'Test'{ + Describe "MSFT_SqlServerNetwork\Test-TargetResource" -Tag 'Test'{ BeforeEach { $testParameters = $mockDefaultParameters.Clone() @@ -309,7 +309,7 @@ try Assert-VerifiableMock } - Describe "MSFT_xSQLServerNetwork\Set-TargetResource" -Tag 'Set'{ + Describe "MSFT_SqlServerNetwork\Set-TargetResource" -Tag 'Set'{ BeforeEach { $testParameters = $mockDefaultParameters.Clone() diff --git a/Tests/Unit/MSFT_xSQLServerPermission.Tests.ps1 b/Tests/Unit/MSFT_SqlServerPermission.Tests.ps1 similarity index 97% rename from Tests/Unit/MSFT_xSQLServerPermission.Tests.ps1 rename to Tests/Unit/MSFT_SqlServerPermission.Tests.ps1 index 217a58e10..5e40ca358 100644 --- a/Tests/Unit/MSFT_xSQLServerPermission.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerPermission.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerPermission' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlServerPermission' #region HEADER @@ -50,7 +50,7 @@ try Permission = $mockPermission } - Describe 'MSFT_xSQLServerPermission\Get-TargetResource' { + Describe 'MSFT_SqlServerPermission\Get-TargetResource' { BeforeEach { $testParameters = $defaultParameters.Clone() @@ -172,7 +172,7 @@ try Assert-VerifiableMock } - Describe 'MSFT_xSQLServerPermission\Test-TargetResource' { + Describe 'MSFT_SqlServerPermission\Test-TargetResource' { BeforeEach { $testParameters = $defaultParameters.Clone() @@ -240,7 +240,7 @@ try Assert-VerifiableMock } - Describe 'MSFT_xSQLServerPermission\Set-TargetResource' { + Describe 'MSFT_SqlServerPermission\Set-TargetResource' { BeforeEach { $testParameters = $defaultParameters.Clone() diff --git a/Tests/Unit/MSFT_xSQLServerReplication.Tests.ps1 b/Tests/Unit/MSFT_SqlServerReplication.Tests.ps1 similarity index 99% rename from Tests/Unit/MSFT_xSQLServerReplication.Tests.ps1 rename to Tests/Unit/MSFT_SqlServerReplication.Tests.ps1 index 0f844c6c9..a67868933 100644 --- a/Tests/Unit/MSFT_xSQLServerReplication.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerReplication.Tests.ps1 @@ -1,8 +1,8 @@ [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingConvertToSecureStringWithPlainText", "")] param () -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerReplication' +$script:DSCModuleName = 'SqlServerDSC' +$script:DSCResourceName = 'MSFT_SqlServerReplication' #region HEADER # Unit Test Template Version: 1.1.0 diff --git a/Tests/Unit/MSFT_xSQLServerRole.Tests.ps1 b/Tests/Unit/MSFT_SqlServerRole.Tests.ps1 similarity index 97% rename from Tests/Unit/MSFT_xSQLServerRole.Tests.ps1 rename to Tests/Unit/MSFT_SqlServerRole.Tests.ps1 index 5b9fba14d..4f8dcf679 100644 --- a/Tests/Unit/MSFT_xSQLServerRole.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerRole.Tests.ps1 @@ -1,1008 +1,1008 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerRole' - -#region HEADER - -# Unit Test Template Version: 1.2.0 -$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) -if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` - (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) -{ - & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) -} - -Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force - -$TestEnvironment = Initialize-TestEnvironment ` - -DSCModuleName $script:DSCModuleName ` - -DSCResourceName $script:DSCResourceName ` - -TestType Unit - -#endregion HEADER - -function Invoke-TestSetup { -} - -function Invoke-TestCleanup { - Restore-TestEnvironment -TestEnvironment $TestEnvironment -} - -# Begin Testing -try -{ - Invoke-TestSetup - - InModuleScope $script:DSCResourceName { - $mockSqlServerName = 'localhost' - $mockSqlServerInstanceName = 'MSSQLSERVER' - $mockSqlServerRole = 'AdminSqlforBI' - $mockSqlServerLoginOne = 'CONTOSO\John' - $mockSqlServerLoginTwo = 'CONTOSO\Kelly' - $mockSqlServerLoginTree = 'CONTOSO\Lucy' - $mockSqlServerLoginFour = 'CONTOSO\Steve' - $mockEnumMemberNames = @($mockSqlServerLoginOne,$mockSqlServerLoginTwo) - $mockSqlServerLoginType = 'WindowsUser' - $mockExpectedServerRoleToDrop = 'ServerRoleToDrop' - - # Default parameters that are used for the It-blocks - $mockDefaultParameters = @{ - SQLInstanceName = $mockSqlServerInstanceName - SQLServer = $mockSqlServerName - } - - #region Function mocks - - $mockConnectSQL = { - return @( - ( - New-Object Object | - Add-Member -MemberType NoteProperty -Name InstanceName -Value $mockSqlServerInstanceName -PassThru | - Add-Member -MemberType NoteProperty -Name ComputerNamePhysicalNetBIOS -Value $mockSqlServerName -PassThru | - Add-Member -MemberType ScriptProperty -Name Roles -Value { - return @{ - $mockSqlServerRole = ( New-Object Object | - Add-Member -MemberType NoteProperty -Name Name -Value $mockSqlServerRole -PassThru | - Add-Member -MemberType ScriptMethod -Name EnumMemberNames -Value { - if ($mockInvalidOperationForEnumMethod) - { - throw 'Mock EnumMemberNames Method was called with invalid operation.' - } - else - { - $mockEnumMemberNames - } - } -PassThru | - Add-Member -MemberType ScriptMethod -Name Drop -Value { - if ($mockInvalidOperationForDropMethod) - { - throw 'Mock Drop Method was called with invalid operation.' - } - - if ( $this.Name -ne $mockExpectedServerRoleToDrop ) - { - throw "Called mocked drop() method without dropping the right server role. Expected '{0}'. But was '{1}'." ` - -f $mockExpectedServerRoleToDrop, $this.Name - } - } -PassThru | - Add-Member -MemberType ScriptMethod -Name AddMember -Value { - if ($mockInvalidOperationForAddMemberMethod) - { - throw 'Mock AddMember Method was called with invalid operation.' - } - - if ( $mockSqlServerLoginToAdd -ne $mockExpectedMemberToAdd ) - { - throw "Called mocked AddMember() method without adding the right login. Expected '{0}'. But was '{1}'." ` - -f $mockExpectedMemberToAdd, $mockSqlServerLoginToAdd - } - } -PassThru | - Add-Member -MemberType ScriptMethod -Name DropMember -Value { - if ($mockInvalidOperationForDropMemberMethod) - { - throw 'Mock DropMember Method was called with invalid operation.' - } - - if ( $mockSqlServerLoginToDrop -ne $mockExpectedMemberToDrop ) - { - throw "Called mocked DropMember() method without removing the right login. Expected '{0}'. But was '{1}'." ` - -f $mockExpectedMemberToDrop, $mockSqlServerLoginToDrop - } - } -PassThru - ) - } - } -PassThru | - Add-Member -MemberType ScriptProperty -Name Logins -Value { - return @{ - $mockSqlServerLoginOne = @(( - New-Object Object | - Add-Member -MemberType NoteProperty -Name LoginType -Value $mockSqlServerLoginType -PassThru - )) - $mockSqlServerLoginTwo = @(( - New-Object Object | - Add-Member -MemberType NoteProperty -Name LoginType -Value $mockSqlServerLoginType -PassThru - )) - $mockSqlServerLoginTree = @(( - New-Object Object | - Add-Member -MemberType NoteProperty -Name LoginType -Value $mockSqlServerLoginType -PassThru - )) - $mockSqlServerLoginFour = @(( - New-Object Object | - Add-Member -MemberType NoteProperty -Name LoginType -Value $mockSqlServerLoginType -PassThru - )) - } - } -PassThru -Force - ) - ) - } - - $mockNewObjectServerRole = { - return @( - ( - New-Object Object | - Add-Member -MemberType NoteProperty -Name Name -Value $mockSqlServerRoleAdd -PassThru | - Add-Member -MemberType ScriptMethod -Name Create -Value { - if ($mockInvalidOperationForCreateMethod) - { - throw 'Mock Create Method was called with invalid operation.' - } - - if ( $this.Name -ne $mockExpectedServerRoleToCreate ) - { - throw "Called mocked Create() method without adding the right server role. Expected '{0}'. But was '{1}'." ` - -f $mockExpectedServerRoleToCreate, $this.Name - } - } -PassThru -Force - ) - ) - } - #endregion - - Describe "MSFT_xSQLServerRole\Get-TargetResource" -Tag 'Get'{ - BeforeEach { - Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable - } - - Context 'When the system is in the desired state and ensure is set to Absent' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - ServerRoleName = 'UnknownRoleName' - } - - It 'Should return the state as absent when the role does not exist' { - $result = Get-TargetResource @testParameters - $result.Ensure | Should -Be 'Absent' - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the members as null' { - $result = Get-TargetResource @testParameters - $result.Members | Should -Be $null - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the same values as passed as parameters' { - $result = Get-TargetResource @testParameters - $result.SQLServer | Should -Be $testParameters.SQLServer - $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName - $result.ServerRoleName | Should -Be $testParameters.ServerRoleName - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is not in the desired state and ensure is set to Absent' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - ServerRoleName = $mockSqlServerRole - } - - It 'Should not return the state as absent when the role exist' { - $result = Get-TargetResource @testParameters - $result.Ensure | Should -Not -Be 'Absent' - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the members as not null' { - $result = Get-TargetResource @testParameters - $result.Members | Should -Not -Be $null - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - # Regression test for issue #790 - It 'Should return the members as string array' { - $result = Get-TargetResource @testParameters - ($result.Members -is [String[]]) | Should -Be $true - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the same values as passed as parameters' { - $result = Get-TargetResource @testParameters - $result.SQLServer | Should -Be $testParameters.SQLServer - $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName - $result.ServerRoleName | Should -Be $testParameters.ServerRoleName - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When passing values to parameters and throwing with EnumMemberNames method' { - It 'Should throw the correct error' { - $mockInvalidOperationForEnumMethod = $true - $testParameters = $mockDefaultParameters - $testParameters += @{ - ServerRoleName = $mockSqlServerRole - } - - $throwInvalidOperation = ('Failed to enumerate members of the server role ' + ` - 'named AdminSqlforBI on localhost\MSSQLSERVER. InnerException: ' + ` - 'Exception calling "EnumMemberNames" with "0" argument(s): ' + ` - '"Mock EnumMemberNames Method was called with invalid operation."') - - { Get-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - } - - Context 'When the system is in the desired state, parameter Members is assigned a value and ensure is set to Present' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - ServerRoleName = $mockSqlServerRole - Members = $mockEnumMemberNames - } - - It 'Should return the state as present when the members are correct' { - $result = Get-TargetResource @testParameters - $result.Ensure | Should -Be 'Present' - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the members as not null' { - $result = Get-TargetResource @testParameters - $result.Members | Should -Be $testParameters.Members - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - # Regression test for issue #790 - It 'Should return the members as string array' { - $result = Get-TargetResource @testParameters - ($result.Members -is [String[]]) | Should -Be $true - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the same values as passed as parameters' { - $result = Get-TargetResource @testParameters - $result.SQLServer | Should -Be $testParameters.SQLServer - $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName - $result.ServerRoleName | Should -Be $testParameters.ServerRoleName - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is in the desired state, parameter MembersToInclude is assigned a value and ensure is set to Present' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - ServerRoleName = $mockSqlServerRole - MembersToInclude = $mockSqlServerLoginTwo - } - - It 'Should return the state as present when the correct members exist' { - $result = Get-TargetResource @testParameters - $result.Ensure | Should -Be 'Present' - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the members as not null' { - $result = Get-TargetResource @testParameters - $result.Members | Should -Not -Be $null - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - # Regression test for issue #790 - It 'Should return the members as string array' { - $result = Get-TargetResource @testParameters - ($result.Members -is [String[]]) | Should -Be $true - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the same values as passed as parameters' { - $result = Get-TargetResource @testParameters - $result.SQLServer | Should -Be $testParameters.SQLServer - $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName - $result.ServerRoleName | Should -Be $testParameters.ServerRoleName - $result.MembersToInclude | Should -Be $testParameters.MembersToInclude - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is in the desired state, parameter MembersToExclude is assigned a value and ensure is set to Present' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - ServerRoleName = $mockSqlServerRole - MembersToExclude = $mockSqlServerLoginTree - } - - It 'Should return the state as present when the members does not exist' { - $result = Get-TargetResource @testParameters - $result.Ensure | Should -Be 'Present' - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the same values as passed as parameters' { - $result = Get-TargetResource @testParameters - $result.SQLServer | Should -Be $testParameters.SQLServer - $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName - $result.ServerRoleName | Should -Be $testParameters.ServerRoleName - $result.MembersToExclude | Should -Be $testParameters.MembersToExclude - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is not in the desired state, parameter MembersToInclude is assigned a value, parameter Members is assigned a value, and ensure is set to Present' { - It 'Should throw the correct error' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - ServerRoleName = $mockSqlServerRole - Members = $mockEnumMemberNames - MembersToInclude = $mockSqlServerLoginTree - } - - $throwInvalidOperation = ('The parameter MembersToInclude and/or ' + ` - 'MembersToExclude must not be set, or be set ' + ` - 'to $null, when parameter Members are used.') - - { Get-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - - } - - Context 'When the system is not in the desired state, parameter MembersToExclude is assigned a value, parameter Members is assigned a value, and ensure is set to Present' { - It 'Should throw the correct error' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - ServerRoleName = $mockSqlServerRole - Members = $mockEnumMemberNames - MembersToExclude = $mockSqlServerLoginTree - } - - $throwInvalidOperation = ('The parameter MembersToInclude and/or ' + ` - 'MembersToExclude must not be set, or be set ' + ` - 'to $null, when parameter Members are used.') - - { Get-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - } - - It 'Should call the mock function Connect-SQL' { - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context - } - } - - Context 'When the system is not in the desired state and ensure is set to Present' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - ServerRoleName = 'UnknownRoleName' - } - - It 'Should return the state as absent when the role does not exist' { - $result = Get-TargetResource @testParameters - $result.Ensure | Should -Be 'Absent' - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the members as null' { - $result = Get-TargetResource @testParameters - $result.Members | Should -Be $null - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the same values as passed as parameters' { - $result = Get-TargetResource @testParameters - $result.SQLServer | Should -Be $testParameters.SQLServer - $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName - $result.ServerRoleName | Should -Be $testParameters.ServerRoleName - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is not in the desired state, parameter Members is assigned a value and ensure is set to Present' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - ServerRoleName = $mockSqlServerRole - Members = @($mockSqlServerLoginOne,$mockSqlServerLoginTree) - } - - It 'Should return the state as absent when the members in the role are wrong' { - $result = Get-TargetResource @testParameters - $result.Ensure | Should -Be 'Absent' - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the members as not null' { - $result = Get-TargetResource @testParameters - $result.Members | Should -Not -Be $null - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - # Regression test for issue #790 - It 'Should return the members as string array' { - $result = Get-TargetResource @testParameters - ($result.Members -is [String[]]) | Should -Be $true - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the same values as passed as parameters' { - $result = Get-TargetResource @testParameters - $result.SQLServer | Should -Be $testParameters.SQLServer - $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName - $result.ServerRoleName | Should -Be $testParameters.ServerRoleName - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is not in the desired state, parameter MembersToInclude is assigned a value and ensure is set to Present' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - ServerRoleName = $mockSqlServerRole - MembersToInclude = $mockSqlServerLoginTree - } - - It 'Should return the state as absent when the members in the role are missing' { - $result = Get-TargetResource @testParameters - $result.Ensure | Should -Be 'Absent' - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the members as not null' { - $result = Get-TargetResource @testParameters - $result.Members | Should -Not -Be $null - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - # Regression test for issue #790 - It 'Should return the members as string array' { - $result = Get-TargetResource @testParameters - ($result.Members -is [String[]]) | Should -Be $true - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the same values as passed as parameters' { - $result = Get-TargetResource @testParameters - $result.SQLServer | Should -Be $testParameters.SQLServer - $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName - $result.ServerRoleName | Should -Be $testParameters.ServerRoleName - $result.MembersToInclude | Should -Be $testParameters.MembersToInclude - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is not in the desired state, parameter MembersToExclude is assigned a value and ensure is set to Present' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - ServerRoleName = $mockSqlServerRole - MembersToExclude = $mockSqlServerLoginTwo - } - - It 'Should return the state as absent when the members in the role are present' { - $result = Get-TargetResource @testParameters - $result.Ensure | Should -Be 'Absent' - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should return the same values as passed as parameters' { - $result = Get-TargetResource @testParameters - $result.SQLServer | Should -Be $testParameters.SQLServer - $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName - $result.ServerRoleName | Should -Be $testParameters.ServerRoleName - $result.MembersToExclude | Should -Be $testParameters.MembersToExclude - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Assert-VerifiableMock - } - - Describe "MSFT_xSQLServerRole\Test-TargetResource" -Tag 'Test'{ - BeforeEach { - Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable - } - - Context 'When the system is not in the desired state and ensure is set to Absent' { - It 'Should return false when desired server role exist' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Absent' - ServerRoleName = $mockSqlServerRole - } - - $result = Test-TargetResource @testParameters - $result | Should -Be $false - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is in the desired state and ensure is set to Absent' { - It 'Should return true when desired server role does not exist' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Absent' - ServerRoleName = 'newServerRole' - } - - $result = Test-TargetResource @testParameters - $result | Should -Be $true - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is in the desired state and ensure is set to Present' { - It 'Should return true when desired server role exist' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRole - } - - $result = Test-TargetResource @testParameters - $result | Should -Be $true - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is not in the desired state and ensure parameter is set to Present' { - It 'Should return false when desired members are not in desired server role' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRole - Members = @($mockSqlServerLoginTree,$mockSqlServerLoginFour) - } - - $result = Test-TargetResource @testParameters - $result | Should -Be $false - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When both the parameters Members and MembersToInclude are assigned a value and ensure is set to Present' { - It 'Should throw the correct error' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRole - Members = $mockEnumMemberNames - MembersToInclude = $mockSqlServerLoginTree - } - - $throwInvalidOperation = ('The parameter MembersToInclude and/or ' + ` - 'MembersToExclude must not be set, or be set ' + ` - 'to $null, when parameter Members are used.') - - { Test-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When parameter MembersToInclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { - It 'Should return true when desired server role exist' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRole - MembersToInclude = $mockSqlServerLoginTwo - } - - $result = Test-TargetResource @testParameters - $result | Should -Be $true - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When parameter MembersToInclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { - It 'Should return false when desired server role does not exist' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRole - MembersToInclude = $mockSqlServerLoginTree - } - - $result = Test-TargetResource @testParameters - $result | Should -Be $false - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When both the parameters Members and MembersToExclude are assigned a value and ensure is set to Present' { - It 'Should throw the correct error' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRole - Members = $mockEnumMemberNames - MembersToExclude = $mockSqlServerLoginTwo - } - - $throwInvalidOperation = ('The parameter MembersToInclude and/or ' + ` - 'MembersToExclude must not be set, or be set ' + ` - 'to $null, when parameter Members are used.') - - { Test-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When parameter MembersToExclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { - It 'Should return true when desired server role does not exist' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRole - MembersToExclude = $mockSqlServerLoginTree - } - - $result = Test-TargetResource @testParameters - $result | Should -Be $true - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When parameter MembersToExclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { - It 'Should return false when desired server role exist' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRole - MembersToExclude = $mockSqlServerLoginTwo - } - - $result = Test-TargetResource @testParameters - $result | Should -Be $false - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Assert-VerifiableMock - } - - Describe "MSFT_xSQLServerRole\Set-TargetResource" -Tag 'Set'{ - BeforeEach { - Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable - Mock -CommandName New-Object -MockWith $mockNewObjectServerRole -ParameterFilter { - $TypeName -eq 'Microsoft.SqlServer.Management.Smo.ServerRole' - } - } - - Context 'When the system is not in the desired state and ensure is set to Absent' { - It 'Should not throw when calling the drop method' { - $mockSqlServerRole = 'ServerRoleToDrop' - $mockExpectedServerRoleToDrop = 'ServerRoleToDrop' - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Absent' - ServerRoleName = $mockSqlServerRole - } - - { Set-TargetResource @testParameters } | Should -Not -Throw - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is not in the desired state and ensure is set to Absent' { - It 'Should throw the correct error when calling the drop method' { - $mockInvalidOperationForDropMethod = $true - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Absent' - ServerRoleName = $mockSqlServerRole - } - - $throwInvalidOperation = ('Failed to drop the server role named AdminSqlforBI on ' + ` - 'localhost\MSSQLSERVER. InnerException: Exception calling ' + ` - '"Drop" with "0" argument(s): "Mock Drop Method ' + ` - 'was called with invalid operation."') - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When the system is not in the desired state and ensure is set to Present' { - It 'Should not throw when calling the create method' { - $mockSqlServerRoleAdd = 'ServerRoleToAdd' - $mockExpectedServerRoleToCreate = 'ServerRoleToAdd' - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRoleAdd - } - - { Set-TargetResource @testParameters } | Should -Not -Throw - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should call the mock function New-Object with TypeName equal to Microsoft.SqlServer.Management.Smo.ServerRole' { - Assert-MockCalled New-Object -Exactly -Times 1 -ParameterFilter { - $TypeName -eq 'Microsoft.SqlServer.Management.Smo.ServerRole' - } -Scope Context - } - } - - Context 'When the system is not in the desired state and ensure is set to Present' { - It 'Should throw the correct error when calling the create method' { - $mockSqlServerRoleAdd = 'ServerRoleToAdd' - $mockExpectedServerRoleToCreate = 'ServerRoleToAdd' - $mockInvalidOperationForCreateMethod = $true - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRoleAdd - } - - $throwInvalidOperation = ('Failed to create the server role named ServerRoleToAdd on ' + ` - 'localhost\MSSQLSERVER. InnerException: Exception calling ' + ` - '"Create" with "0" argument(s): "Mock Create Method ' + ` - 'was called with invalid operation."') - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - - It 'Should call the mock function New-Object with TypeName equal to Microsoft.SqlServer.Management.Smo.ServerRole' { - Assert-MockCalled New-Object -Exactly -Times 1 -ParameterFilter { - $TypeName -eq 'Microsoft.SqlServer.Management.Smo.ServerRole' - } -Scope Context - } - } - - Context 'When both the parameters Members and MembersToInclude are assigned a value and ensure is set to Present' { - It 'Should throw the correct error' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRole - Members = $mockEnumMemberNames - MembersToInclude = $mockSqlServerLoginTree - } - - $throwInvalidOperation = ('The parameter MembersToInclude and/or ' + ` - 'MembersToExclude must not be set, or be set ' + ` - 'to $null, when parameter Members are used.') - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When both the parameters Members and MembersToExclude are assigned a value and ensure is set to Present' { - It 'Should throw the correct error' { - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRole - Members = $mockEnumMemberNames - MembersToExclude = $mockSqlServerLoginTwo - } - - $throwInvalidOperation = ('The parameter MembersToInclude and/or ' + ` - 'MembersToExclude must not be set, or be set ' + ` - 'to $null, when parameter Members are used.') - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When parameter MembersToInclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { - It 'Should not thrown when calling the AddMember method' { - $mockExpectedMemberToAdd = $mockSqlServerLoginTree - $mockSqlServerLoginToAdd = $mockSqlServerLoginTree - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRole - MembersToInclude = $mockSqlServerLoginTree - } - - { Set-TargetResource @testParameters } | Should -Not -Throw - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When parameter MembersToInclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { - It 'Should throw the correct error when calling the AddMember method' { - $mockInvalidOperationForAddMemberMethod = $true - $mockExpectedMemberToAdd = $mockSqlServerLoginTree - $mockSqlServerLoginToAdd = $mockSqlServerLoginTree - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRole - MembersToInclude = $mockSqlServerLoginTree - } - - $throwInvalidOperation = ('Failed to add member CONTOSO\Lucy to the server role named AdminSqlforBI ' + ` - 'on localhost\MSSQLSERVER. InnerException: Exception calling "AddMember" ' + ` - 'with "1" argument(s): "Mock AddMember Method was called with invalid operation."') - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When parameter MembersToInclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { - It 'Should throw the correct error when login does not exist' { - $mockExpectedMemberToAdd = $mockSqlServerLoginTree - $mockSqlServerLoginToAdd = $mockSqlServerLoginTree - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRole - MembersToInclude = 'KingJulian' - } - - $throwInvalidOperation = ("Login 'KingJulian' does not exist on SQL server 'localhost\MSSQLSERVER'.") - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When parameter MembersToExclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { - It 'Should not throw when calling the DropMember method' { - $mockExpectedMemberToAdd = $mockSqlServerLoginTwo - $mockSqlServerLoginToAdd = $mockSqlServerLoginTwo - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRole - MembersToExclude = $mockSqlServerLoginTwo - } - - { Set-TargetResource @testParameters } | Should -Not -Throw - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When parameter MembersToExclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { - It 'Should throw the correct error when calling the DropMember method' { - $mockInvalidOperationForDropMemberMethod = $true - $mockExpectedMemberToDrop = $mockSqlServerLoginTwo - $mockSqlServerLoginToDrop = $mockSqlServerLoginTwo - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRole - MembersToExclude = $mockSqlServerLoginTwo - } - - $throwInvalidOperation = ('Failed to drop member CONTOSO\Kelly to the server role named AdminSqlforBI ' + ` - 'on localhost\MSSQLSERVER. InnerException: Exception calling "DropMember" ' + ` - 'with "1" argument(s): "Mock DropMember Method was called with invalid operation."') - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When parameter MembersToExclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { - It 'Should throw the correct error when login does not exist' { - $mockEnumMemberNames = @('KingJulian',$mockSqlServerLoginOne,$mockSqlServerLoginTwo) - $mockExpectedMemberToAdd = $mockSqlServerLoginTree - $mockSqlServerLoginToAdd = $mockSqlServerLoginTree - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRole - MembersToExclude = 'KingJulian' - } - - $throwInvalidOperation = ("Login 'KingJulian' does not exist on SQL server 'localhost\MSSQLSERVER'.") - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When parameter Members is assigned a value and ensure is set to Present' { - It 'Should throw the correct error when login does not exist' { - $mockExpectedMemberToAdd = $mockSqlServerLoginTree - $mockSqlServerLoginToAdd = $mockSqlServerLoginTree - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRole - Members = @('KingJulian',$mockSqlServerLoginOne,$mockSqlServerLoginTree) - } - - $throwInvalidOperation = ("Login 'KingJulian' does not exist on SQL server 'localhost\MSSQLSERVER'.") - - { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Context 'When Members parameter is set and ensure parameter is set to Present' { - It 'Should not throw when calling both the AddMember and DropMember methods' { - $mockExpectedMemberToAdd = $mockSqlServerLoginTree - $mockSqlServerLoginToAdd = $mockSqlServerLoginTree - $mockExpectedMemberToDrop = $mockSqlServerLoginTwo - $mockSqlServerLoginToDrop = $mockSqlServerLoginTwo - $testParameters = $mockDefaultParameters - $testParameters += @{ - Ensure = 'Present' - ServerRoleName = $mockSqlServerRole - Members = @($mockSqlServerLoginOne,$mockSqlServerLoginTree) - } - - { Set-TargetResource @testParameters } | Should -Not -Throw - - Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It - } - } - - Assert-VerifiableMock - } - } -} -finally -{ - Invoke-TestCleanup -} - +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlServerRole' + +#region HEADER + +# Unit Test Template Version: 1.2.0 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) +} + +Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $script:DSCModuleName ` + -DSCResourceName $script:DSCResourceName ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup { +} + +function Invoke-TestCleanup { + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope $script:DSCResourceName { + $mockSqlServerName = 'localhost' + $mockSqlServerInstanceName = 'MSSQLSERVER' + $mockSqlServerRole = 'AdminSqlforBI' + $mockSqlServerLoginOne = 'CONTOSO\John' + $mockSqlServerLoginTwo = 'CONTOSO\Kelly' + $mockSqlServerLoginTree = 'CONTOSO\Lucy' + $mockSqlServerLoginFour = 'CONTOSO\Steve' + $mockEnumMemberNames = @($mockSqlServerLoginOne,$mockSqlServerLoginTwo) + $mockSqlServerLoginType = 'WindowsUser' + $mockExpectedServerRoleToDrop = 'ServerRoleToDrop' + + # Default parameters that are used for the It-blocks + $mockDefaultParameters = @{ + SQLInstanceName = $mockSqlServerInstanceName + SQLServer = $mockSqlServerName + } + + #region Function mocks + + $mockConnectSQL = { + return @( + ( + New-Object Object | + Add-Member -MemberType NoteProperty -Name InstanceName -Value $mockSqlServerInstanceName -PassThru | + Add-Member -MemberType NoteProperty -Name ComputerNamePhysicalNetBIOS -Value $mockSqlServerName -PassThru | + Add-Member -MemberType ScriptProperty -Name Roles -Value { + return @{ + $mockSqlServerRole = ( New-Object Object | + Add-Member -MemberType NoteProperty -Name Name -Value $mockSqlServerRole -PassThru | + Add-Member -MemberType ScriptMethod -Name EnumMemberNames -Value { + if ($mockInvalidOperationForEnumMethod) + { + throw 'Mock EnumMemberNames Method was called with invalid operation.' + } + else + { + $mockEnumMemberNames + } + } -PassThru | + Add-Member -MemberType ScriptMethod -Name Drop -Value { + if ($mockInvalidOperationForDropMethod) + { + throw 'Mock Drop Method was called with invalid operation.' + } + + if ( $this.Name -ne $mockExpectedServerRoleToDrop ) + { + throw "Called mocked drop() method without dropping the right server role. Expected '{0}'. But was '{1}'." ` + -f $mockExpectedServerRoleToDrop, $this.Name + } + } -PassThru | + Add-Member -MemberType ScriptMethod -Name AddMember -Value { + if ($mockInvalidOperationForAddMemberMethod) + { + throw 'Mock AddMember Method was called with invalid operation.' + } + + if ( $mockSqlServerLoginToAdd -ne $mockExpectedMemberToAdd ) + { + throw "Called mocked AddMember() method without adding the right login. Expected '{0}'. But was '{1}'." ` + -f $mockExpectedMemberToAdd, $mockSqlServerLoginToAdd + } + } -PassThru | + Add-Member -MemberType ScriptMethod -Name DropMember -Value { + if ($mockInvalidOperationForDropMemberMethod) + { + throw 'Mock DropMember Method was called with invalid operation.' + } + + if ( $mockSqlServerLoginToDrop -ne $mockExpectedMemberToDrop ) + { + throw "Called mocked DropMember() method without removing the right login. Expected '{0}'. But was '{1}'." ` + -f $mockExpectedMemberToDrop, $mockSqlServerLoginToDrop + } + } -PassThru + ) + } + } -PassThru | + Add-Member -MemberType ScriptProperty -Name Logins -Value { + return @{ + $mockSqlServerLoginOne = @(( + New-Object Object | + Add-Member -MemberType NoteProperty -Name LoginType -Value $mockSqlServerLoginType -PassThru + )) + $mockSqlServerLoginTwo = @(( + New-Object Object | + Add-Member -MemberType NoteProperty -Name LoginType -Value $mockSqlServerLoginType -PassThru + )) + $mockSqlServerLoginTree = @(( + New-Object Object | + Add-Member -MemberType NoteProperty -Name LoginType -Value $mockSqlServerLoginType -PassThru + )) + $mockSqlServerLoginFour = @(( + New-Object Object | + Add-Member -MemberType NoteProperty -Name LoginType -Value $mockSqlServerLoginType -PassThru + )) + } + } -PassThru -Force + ) + ) + } + + $mockNewObjectServerRole = { + return @( + ( + New-Object Object | + Add-Member -MemberType NoteProperty -Name Name -Value $mockSqlServerRoleAdd -PassThru | + Add-Member -MemberType ScriptMethod -Name Create -Value { + if ($mockInvalidOperationForCreateMethod) + { + throw 'Mock Create Method was called with invalid operation.' + } + + if ( $this.Name -ne $mockExpectedServerRoleToCreate ) + { + throw "Called mocked Create() method without adding the right server role. Expected '{0}'. But was '{1}'." ` + -f $mockExpectedServerRoleToCreate, $this.Name + } + } -PassThru -Force + ) + ) + } + #endregion + + Describe "MSFT_SqlServerRole\Get-TargetResource" -Tag 'Get'{ + BeforeEach { + Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable + } + + Context 'When the system is in the desired state and ensure is set to Absent' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + ServerRoleName = 'UnknownRoleName' + } + + It 'Should return the state as absent when the role does not exist' { + $result = Get-TargetResource @testParameters + $result.Ensure | Should -Be 'Absent' + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the members as null' { + $result = Get-TargetResource @testParameters + $result.Members | Should -Be $null + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the same values as passed as parameters' { + $result = Get-TargetResource @testParameters + $result.SQLServer | Should -Be $testParameters.SQLServer + $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName + $result.ServerRoleName | Should -Be $testParameters.ServerRoleName + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is not in the desired state and ensure is set to Absent' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + ServerRoleName = $mockSqlServerRole + } + + It 'Should not return the state as absent when the role exist' { + $result = Get-TargetResource @testParameters + $result.Ensure | Should -Not -Be 'Absent' + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the members as not null' { + $result = Get-TargetResource @testParameters + $result.Members | Should -Not -Be $null + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + # Regression test for issue #790 + It 'Should return the members as string array' { + $result = Get-TargetResource @testParameters + ($result.Members -is [String[]]) | Should -Be $true + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the same values as passed as parameters' { + $result = Get-TargetResource @testParameters + $result.SQLServer | Should -Be $testParameters.SQLServer + $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName + $result.ServerRoleName | Should -Be $testParameters.ServerRoleName + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When passing values to parameters and throwing with EnumMemberNames method' { + It 'Should throw the correct error' { + $mockInvalidOperationForEnumMethod = $true + $testParameters = $mockDefaultParameters + $testParameters += @{ + ServerRoleName = $mockSqlServerRole + } + + $throwInvalidOperation = ('Failed to enumerate members of the server role ' + ` + 'named AdminSqlforBI on localhost\MSSQLSERVER. InnerException: ' + ` + 'Exception calling "EnumMemberNames" with "0" argument(s): ' + ` + '"Mock EnumMemberNames Method was called with invalid operation."') + + { Get-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + } + + Context 'When the system is in the desired state, parameter Members is assigned a value and ensure is set to Present' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + ServerRoleName = $mockSqlServerRole + Members = $mockEnumMemberNames + } + + It 'Should return the state as present when the members are correct' { + $result = Get-TargetResource @testParameters + $result.Ensure | Should -Be 'Present' + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the members as not null' { + $result = Get-TargetResource @testParameters + $result.Members | Should -Be $testParameters.Members + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + # Regression test for issue #790 + It 'Should return the members as string array' { + $result = Get-TargetResource @testParameters + ($result.Members -is [String[]]) | Should -Be $true + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the same values as passed as parameters' { + $result = Get-TargetResource @testParameters + $result.SQLServer | Should -Be $testParameters.SQLServer + $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName + $result.ServerRoleName | Should -Be $testParameters.ServerRoleName + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is in the desired state, parameter MembersToInclude is assigned a value and ensure is set to Present' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + ServerRoleName = $mockSqlServerRole + MembersToInclude = $mockSqlServerLoginTwo + } + + It 'Should return the state as present when the correct members exist' { + $result = Get-TargetResource @testParameters + $result.Ensure | Should -Be 'Present' + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the members as not null' { + $result = Get-TargetResource @testParameters + $result.Members | Should -Not -Be $null + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + # Regression test for issue #790 + It 'Should return the members as string array' { + $result = Get-TargetResource @testParameters + ($result.Members -is [String[]]) | Should -Be $true + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the same values as passed as parameters' { + $result = Get-TargetResource @testParameters + $result.SQLServer | Should -Be $testParameters.SQLServer + $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName + $result.ServerRoleName | Should -Be $testParameters.ServerRoleName + $result.MembersToInclude | Should -Be $testParameters.MembersToInclude + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is in the desired state, parameter MembersToExclude is assigned a value and ensure is set to Present' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + ServerRoleName = $mockSqlServerRole + MembersToExclude = $mockSqlServerLoginTree + } + + It 'Should return the state as present when the members does not exist' { + $result = Get-TargetResource @testParameters + $result.Ensure | Should -Be 'Present' + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the same values as passed as parameters' { + $result = Get-TargetResource @testParameters + $result.SQLServer | Should -Be $testParameters.SQLServer + $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName + $result.ServerRoleName | Should -Be $testParameters.ServerRoleName + $result.MembersToExclude | Should -Be $testParameters.MembersToExclude + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is not in the desired state, parameter MembersToInclude is assigned a value, parameter Members is assigned a value, and ensure is set to Present' { + It 'Should throw the correct error' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + ServerRoleName = $mockSqlServerRole + Members = $mockEnumMemberNames + MembersToInclude = $mockSqlServerLoginTree + } + + $throwInvalidOperation = ('The parameter MembersToInclude and/or ' + ` + 'MembersToExclude must not be set, or be set ' + ` + 'to $null, when parameter Members are used.') + + { Get-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + + } + + Context 'When the system is not in the desired state, parameter MembersToExclude is assigned a value, parameter Members is assigned a value, and ensure is set to Present' { + It 'Should throw the correct error' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + ServerRoleName = $mockSqlServerRole + Members = $mockEnumMemberNames + MembersToExclude = $mockSqlServerLoginTree + } + + $throwInvalidOperation = ('The parameter MembersToInclude and/or ' + ` + 'MembersToExclude must not be set, or be set ' + ` + 'to $null, when parameter Members are used.') + + { Get-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + } + + It 'Should call the mock function Connect-SQL' { + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope Context + } + } + + Context 'When the system is not in the desired state and ensure is set to Present' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + ServerRoleName = 'UnknownRoleName' + } + + It 'Should return the state as absent when the role does not exist' { + $result = Get-TargetResource @testParameters + $result.Ensure | Should -Be 'Absent' + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the members as null' { + $result = Get-TargetResource @testParameters + $result.Members | Should -Be $null + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the same values as passed as parameters' { + $result = Get-TargetResource @testParameters + $result.SQLServer | Should -Be $testParameters.SQLServer + $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName + $result.ServerRoleName | Should -Be $testParameters.ServerRoleName + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is not in the desired state, parameter Members is assigned a value and ensure is set to Present' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + ServerRoleName = $mockSqlServerRole + Members = @($mockSqlServerLoginOne,$mockSqlServerLoginTree) + } + + It 'Should return the state as absent when the members in the role are wrong' { + $result = Get-TargetResource @testParameters + $result.Ensure | Should -Be 'Absent' + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the members as not null' { + $result = Get-TargetResource @testParameters + $result.Members | Should -Not -Be $null + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + # Regression test for issue #790 + It 'Should return the members as string array' { + $result = Get-TargetResource @testParameters + ($result.Members -is [String[]]) | Should -Be $true + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the same values as passed as parameters' { + $result = Get-TargetResource @testParameters + $result.SQLServer | Should -Be $testParameters.SQLServer + $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName + $result.ServerRoleName | Should -Be $testParameters.ServerRoleName + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is not in the desired state, parameter MembersToInclude is assigned a value and ensure is set to Present' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + ServerRoleName = $mockSqlServerRole + MembersToInclude = $mockSqlServerLoginTree + } + + It 'Should return the state as absent when the members in the role are missing' { + $result = Get-TargetResource @testParameters + $result.Ensure | Should -Be 'Absent' + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the members as not null' { + $result = Get-TargetResource @testParameters + $result.Members | Should -Not -Be $null + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + # Regression test for issue #790 + It 'Should return the members as string array' { + $result = Get-TargetResource @testParameters + ($result.Members -is [String[]]) | Should -Be $true + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the same values as passed as parameters' { + $result = Get-TargetResource @testParameters + $result.SQLServer | Should -Be $testParameters.SQLServer + $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName + $result.ServerRoleName | Should -Be $testParameters.ServerRoleName + $result.MembersToInclude | Should -Be $testParameters.MembersToInclude + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is not in the desired state, parameter MembersToExclude is assigned a value and ensure is set to Present' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + ServerRoleName = $mockSqlServerRole + MembersToExclude = $mockSqlServerLoginTwo + } + + It 'Should return the state as absent when the members in the role are present' { + $result = Get-TargetResource @testParameters + $result.Ensure | Should -Be 'Absent' + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should return the same values as passed as parameters' { + $result = Get-TargetResource @testParameters + $result.SQLServer | Should -Be $testParameters.SQLServer + $result.SQLInstanceName | Should -Be $testParameters.SQLInstanceName + $result.ServerRoleName | Should -Be $testParameters.ServerRoleName + $result.MembersToExclude | Should -Be $testParameters.MembersToExclude + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Assert-VerifiableMock + } + + Describe "MSFT_SqlServerRole\Test-TargetResource" -Tag 'Test'{ + BeforeEach { + Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable + } + + Context 'When the system is not in the desired state and ensure is set to Absent' { + It 'Should return false when desired server role exist' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Absent' + ServerRoleName = $mockSqlServerRole + } + + $result = Test-TargetResource @testParameters + $result | Should -Be $false + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is in the desired state and ensure is set to Absent' { + It 'Should return true when desired server role does not exist' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Absent' + ServerRoleName = 'newServerRole' + } + + $result = Test-TargetResource @testParameters + $result | Should -Be $true + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is in the desired state and ensure is set to Present' { + It 'Should return true when desired server role exist' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRole + } + + $result = Test-TargetResource @testParameters + $result | Should -Be $true + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is not in the desired state and ensure parameter is set to Present' { + It 'Should return false when desired members are not in desired server role' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRole + Members = @($mockSqlServerLoginTree,$mockSqlServerLoginFour) + } + + $result = Test-TargetResource @testParameters + $result | Should -Be $false + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When both the parameters Members and MembersToInclude are assigned a value and ensure is set to Present' { + It 'Should throw the correct error' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRole + Members = $mockEnumMemberNames + MembersToInclude = $mockSqlServerLoginTree + } + + $throwInvalidOperation = ('The parameter MembersToInclude and/or ' + ` + 'MembersToExclude must not be set, or be set ' + ` + 'to $null, when parameter Members are used.') + + { Test-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When parameter MembersToInclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { + It 'Should return true when desired server role exist' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRole + MembersToInclude = $mockSqlServerLoginTwo + } + + $result = Test-TargetResource @testParameters + $result | Should -Be $true + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When parameter MembersToInclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { + It 'Should return false when desired server role does not exist' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRole + MembersToInclude = $mockSqlServerLoginTree + } + + $result = Test-TargetResource @testParameters + $result | Should -Be $false + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When both the parameters Members and MembersToExclude are assigned a value and ensure is set to Present' { + It 'Should throw the correct error' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRole + Members = $mockEnumMemberNames + MembersToExclude = $mockSqlServerLoginTwo + } + + $throwInvalidOperation = ('The parameter MembersToInclude and/or ' + ` + 'MembersToExclude must not be set, or be set ' + ` + 'to $null, when parameter Members are used.') + + { Test-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When parameter MembersToExclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { + It 'Should return true when desired server role does not exist' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRole + MembersToExclude = $mockSqlServerLoginTree + } + + $result = Test-TargetResource @testParameters + $result | Should -Be $true + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When parameter MembersToExclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { + It 'Should return false when desired server role exist' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRole + MembersToExclude = $mockSqlServerLoginTwo + } + + $result = Test-TargetResource @testParameters + $result | Should -Be $false + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Assert-VerifiableMock + } + + Describe "MSFT_SqlServerRole\Set-TargetResource" -Tag 'Set'{ + BeforeEach { + Mock -CommandName Connect-SQL -MockWith $mockConnectSQL -Verifiable + Mock -CommandName New-Object -MockWith $mockNewObjectServerRole -ParameterFilter { + $TypeName -eq 'Microsoft.SqlServer.Management.Smo.ServerRole' + } + } + + Context 'When the system is not in the desired state and ensure is set to Absent' { + It 'Should not throw when calling the drop method' { + $mockSqlServerRole = 'ServerRoleToDrop' + $mockExpectedServerRoleToDrop = 'ServerRoleToDrop' + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Absent' + ServerRoleName = $mockSqlServerRole + } + + { Set-TargetResource @testParameters } | Should -Not -Throw + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is not in the desired state and ensure is set to Absent' { + It 'Should throw the correct error when calling the drop method' { + $mockInvalidOperationForDropMethod = $true + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Absent' + ServerRoleName = $mockSqlServerRole + } + + $throwInvalidOperation = ('Failed to drop the server role named AdminSqlforBI on ' + ` + 'localhost\MSSQLSERVER. InnerException: Exception calling ' + ` + '"Drop" with "0" argument(s): "Mock Drop Method ' + ` + 'was called with invalid operation."') + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When the system is not in the desired state and ensure is set to Present' { + It 'Should not throw when calling the create method' { + $mockSqlServerRoleAdd = 'ServerRoleToAdd' + $mockExpectedServerRoleToCreate = 'ServerRoleToAdd' + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRoleAdd + } + + { Set-TargetResource @testParameters } | Should -Not -Throw + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should call the mock function New-Object with TypeName equal to Microsoft.SqlServer.Management.Smo.ServerRole' { + Assert-MockCalled New-Object -Exactly -Times 1 -ParameterFilter { + $TypeName -eq 'Microsoft.SqlServer.Management.Smo.ServerRole' + } -Scope Context + } + } + + Context 'When the system is not in the desired state and ensure is set to Present' { + It 'Should throw the correct error when calling the create method' { + $mockSqlServerRoleAdd = 'ServerRoleToAdd' + $mockExpectedServerRoleToCreate = 'ServerRoleToAdd' + $mockInvalidOperationForCreateMethod = $true + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRoleAdd + } + + $throwInvalidOperation = ('Failed to create the server role named ServerRoleToAdd on ' + ` + 'localhost\MSSQLSERVER. InnerException: Exception calling ' + ` + '"Create" with "0" argument(s): "Mock Create Method ' + ` + 'was called with invalid operation."') + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + + It 'Should call the mock function New-Object with TypeName equal to Microsoft.SqlServer.Management.Smo.ServerRole' { + Assert-MockCalled New-Object -Exactly -Times 1 -ParameterFilter { + $TypeName -eq 'Microsoft.SqlServer.Management.Smo.ServerRole' + } -Scope Context + } + } + + Context 'When both the parameters Members and MembersToInclude are assigned a value and ensure is set to Present' { + It 'Should throw the correct error' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRole + Members = $mockEnumMemberNames + MembersToInclude = $mockSqlServerLoginTree + } + + $throwInvalidOperation = ('The parameter MembersToInclude and/or ' + ` + 'MembersToExclude must not be set, or be set ' + ` + 'to $null, when parameter Members are used.') + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When both the parameters Members and MembersToExclude are assigned a value and ensure is set to Present' { + It 'Should throw the correct error' { + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRole + Members = $mockEnumMemberNames + MembersToExclude = $mockSqlServerLoginTwo + } + + $throwInvalidOperation = ('The parameter MembersToInclude and/or ' + ` + 'MembersToExclude must not be set, or be set ' + ` + 'to $null, when parameter Members are used.') + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When parameter MembersToInclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { + It 'Should not thrown when calling the AddMember method' { + $mockExpectedMemberToAdd = $mockSqlServerLoginTree + $mockSqlServerLoginToAdd = $mockSqlServerLoginTree + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRole + MembersToInclude = $mockSqlServerLoginTree + } + + { Set-TargetResource @testParameters } | Should -Not -Throw + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When parameter MembersToInclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { + It 'Should throw the correct error when calling the AddMember method' { + $mockInvalidOperationForAddMemberMethod = $true + $mockExpectedMemberToAdd = $mockSqlServerLoginTree + $mockSqlServerLoginToAdd = $mockSqlServerLoginTree + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRole + MembersToInclude = $mockSqlServerLoginTree + } + + $throwInvalidOperation = ('Failed to add member CONTOSO\Lucy to the server role named AdminSqlforBI ' + ` + 'on localhost\MSSQLSERVER. InnerException: Exception calling "AddMember" ' + ` + 'with "1" argument(s): "Mock AddMember Method was called with invalid operation."') + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When parameter MembersToInclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { + It 'Should throw the correct error when login does not exist' { + $mockExpectedMemberToAdd = $mockSqlServerLoginTree + $mockSqlServerLoginToAdd = $mockSqlServerLoginTree + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRole + MembersToInclude = 'KingJulian' + } + + $throwInvalidOperation = ("Login 'KingJulian' does not exist on SQL server 'localhost\MSSQLSERVER'.") + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When parameter MembersToExclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { + It 'Should not throw when calling the DropMember method' { + $mockExpectedMemberToAdd = $mockSqlServerLoginTwo + $mockSqlServerLoginToAdd = $mockSqlServerLoginTwo + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRole + MembersToExclude = $mockSqlServerLoginTwo + } + + { Set-TargetResource @testParameters } | Should -Not -Throw + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When parameter MembersToExclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { + It 'Should throw the correct error when calling the DropMember method' { + $mockInvalidOperationForDropMemberMethod = $true + $mockExpectedMemberToDrop = $mockSqlServerLoginTwo + $mockSqlServerLoginToDrop = $mockSqlServerLoginTwo + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRole + MembersToExclude = $mockSqlServerLoginTwo + } + + $throwInvalidOperation = ('Failed to drop member CONTOSO\Kelly to the server role named AdminSqlforBI ' + ` + 'on localhost\MSSQLSERVER. InnerException: Exception calling "DropMember" ' + ` + 'with "1" argument(s): "Mock DropMember Method was called with invalid operation."') + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When parameter MembersToExclude is assigned a value, parameter Members is not assigned a value, and ensure is set to Present' { + It 'Should throw the correct error when login does not exist' { + $mockEnumMemberNames = @('KingJulian',$mockSqlServerLoginOne,$mockSqlServerLoginTwo) + $mockExpectedMemberToAdd = $mockSqlServerLoginTree + $mockSqlServerLoginToAdd = $mockSqlServerLoginTree + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRole + MembersToExclude = 'KingJulian' + } + + $throwInvalidOperation = ("Login 'KingJulian' does not exist on SQL server 'localhost\MSSQLSERVER'.") + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When parameter Members is assigned a value and ensure is set to Present' { + It 'Should throw the correct error when login does not exist' { + $mockExpectedMemberToAdd = $mockSqlServerLoginTree + $mockSqlServerLoginToAdd = $mockSqlServerLoginTree + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRole + Members = @('KingJulian',$mockSqlServerLoginOne,$mockSqlServerLoginTree) + } + + $throwInvalidOperation = ("Login 'KingJulian' does not exist on SQL server 'localhost\MSSQLSERVER'.") + + { Set-TargetResource @testParameters } | Should -Throw $throwInvalidOperation + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Context 'When Members parameter is set and ensure parameter is set to Present' { + It 'Should not throw when calling both the AddMember and DropMember methods' { + $mockExpectedMemberToAdd = $mockSqlServerLoginTree + $mockSqlServerLoginToAdd = $mockSqlServerLoginTree + $mockExpectedMemberToDrop = $mockSqlServerLoginTwo + $mockSqlServerLoginToDrop = $mockSqlServerLoginTwo + $testParameters = $mockDefaultParameters + $testParameters += @{ + Ensure = 'Present' + ServerRoleName = $mockSqlServerRole + Members = @($mockSqlServerLoginOne,$mockSqlServerLoginTree) + } + + { Set-TargetResource @testParameters } | Should -Not -Throw + + Assert-MockCalled Connect-SQL -Exactly -Times 1 -Scope It + } + } + + Assert-VerifiableMock + } + } +} +finally +{ + Invoke-TestCleanup +} + diff --git a/Tests/Unit/MSFT_xSQLServerServiceAccount.Tests.ps1 b/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 similarity index 98% rename from Tests/Unit/MSFT_xSQLServerServiceAccount.Tests.ps1 rename to Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 index 68a08fc16..164d0c49e 100644 --- a/Tests/Unit/MSFT_xSQLServerServiceAccount.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlServerServiceAccount.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerServiceAccount' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlServerServiceAccount' #region HEADER @@ -223,7 +223,7 @@ try Verifiable = $true } - Describe 'MSFT_xSQLServerServiceAccount\ConvertTo-ManagedServiceType' -Tag 'Helper' { + Describe 'MSFT_SqlServerServiceAccount\ConvertTo-ManagedServiceType' -Tag 'Helper' { Context 'Translating service types' { $testCases = @( @{ @@ -286,7 +286,7 @@ try } } - Describe 'MSFT_xSQLServerServiceAccount\Get-ServiceObject' -Tag 'Helper' { + Describe 'MSFT_SqlServerServiceAccount\Get-ServiceObject' -Tag 'Helper' { Mock -CommandName Import-SQLPSModule -Verifiable $defaultGetServiceObjectParameters = @{ @@ -328,7 +328,7 @@ try } } - Describe 'MSFT_xSQLServerServiceAccount\Get-TargetResource' -Tag 'Get' { + Describe 'MSFT_SqlServerServiceAccount\Get-TargetResource' -Tag 'Get' { Mock -CommandName Import-SQLPSModule -Verifiable Context 'When getting the service information for a default instance' { @@ -433,7 +433,7 @@ try } } - Describe 'MSFT_xSQLServerServiceAccount\Test-TargetResource' -Tag 'Test' { + Describe 'MSFT_SqlServerServiceAccount\Test-TargetResource' -Tag 'Test' { Mock -CommandName Import-SQLPSModule -Verifiable Context 'When the system is not in the desired state for a default instance' { @@ -552,7 +552,7 @@ try } } - Describe 'MSFT_xSQLServerServiceAccount\Set-TargetResource' -Tag 'Set' { + Describe 'MSFT_SqlServerServiceAccount\Set-TargetResource' -Tag 'Set' { Mock -CommandName Import-SQLPSModule -Verifiable Context 'When changing the service account for the default instance' { diff --git a/Tests/Unit/MSFT_xSQLServerSetup.Tests.ps1 b/Tests/Unit/MSFT_SqlSetup.Tests.ps1 similarity index 99% rename from Tests/Unit/MSFT_xSQLServerSetup.Tests.ps1 rename to Tests/Unit/MSFT_SqlSetup.Tests.ps1 index 26d9096c8..32cc280c8 100644 --- a/Tests/Unit/MSFT_xSQLServerSetup.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlSetup.Tests.ps1 @@ -2,8 +2,8 @@ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingConvertToSecureStringWithPlainText', '')] param() -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerSetup' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlSetup' #region HEADER @@ -935,7 +935,7 @@ try Features = 'SQLEngine' } - Describe "xSQLServerSetup\Get-TargetResource" -Tag 'Get' { + Describe "SqlSetup\Get-TargetResource" -Tag 'Get' { #region Setting up TestDrive:\ # Local path to TestDrive:\ @@ -2262,7 +2262,7 @@ try Assert-VerifiableMock } - Describe "xSQLServerSetup\Test-TargetResource" -Tag 'Test' { + Describe "SqlSetup\Test-TargetResource" -Tag 'Test' { #region Setting up TestDrive:\ # Local path to TestDrive:\ @@ -2884,7 +2884,7 @@ try Assert-VerifiableMock } - Describe "xSQLServerSetup\Set-TargetResource" -Tag 'Set' { + Describe "SqlSetup\Set-TargetResource" -Tag 'Set' { #region Setting up TestDrive:\ # Local path to TestDrive:\ diff --git a/Tests/Unit/MSFT_xWaitForAvailabilityGroup.Tests.ps1 b/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 similarity index 96% rename from Tests/Unit/MSFT_xWaitForAvailabilityGroup.Tests.ps1 rename to Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 index 42a9d2beb..afbaf5be3 100644 --- a/Tests/Unit/MSFT_xWaitForAvailabilityGroup.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlWaitForAvailabilityGroup.Tests.ps1 @@ -1,5 +1,5 @@ -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xWaitForAvailabilityGroup' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlWaitForAvailabilityGroup' #region HEADER @@ -78,7 +78,7 @@ try RetryCount = $mockRetryCount } - Describe 'MSFT_xWaitForAvailabilityGroup\Get-TargetResource' -Tag 'Get' { + Describe 'MSFT_SqlWaitForAvailabilityGroup\Get-TargetResource' -Tag 'Get' { BeforeEach { $testParameters = $mockDefaultParameters.Clone() @@ -142,7 +142,7 @@ try } - Describe 'MSFT_xWaitForAvailabilityGroup\Test-TargetResource' -Tag 'Test'{ + Describe 'MSFT_SqlWaitForAvailabilityGroup\Test-TargetResource' -Tag 'Test'{ BeforeEach { $testParameters = $mockDefaultParameters.Clone() @@ -191,7 +191,7 @@ try Assert-VerifiableMock } - Describe 'MSFT_xWaitForAvailabilityGroup\Set-TargetResource' -Tag 'Set'{ + Describe 'MSFT_SqlWaitForAvailabilityGroup\Set-TargetResource' -Tag 'Set'{ BeforeEach { $testParameters = $mockDefaultParameters.Clone() diff --git a/Tests/Unit/MSFT_xSQLServerFirewall.Tests.ps1 b/Tests/Unit/MSFT_SqlWindowsFirewall.Tests.ps1 similarity index 99% rename from Tests/Unit/MSFT_xSQLServerFirewall.Tests.ps1 rename to Tests/Unit/MSFT_SqlWindowsFirewall.Tests.ps1 index 9eefeee7b..fc5d495a0 100644 --- a/Tests/Unit/MSFT_xSQLServerFirewall.Tests.ps1 +++ b/Tests/Unit/MSFT_SqlWindowsFirewall.Tests.ps1 @@ -2,8 +2,8 @@ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingConvertToSecureStringWithPlainText', '')] param() -$script:DSCModuleName = 'xSQLServer' -$script:DSCResourceName = 'MSFT_xSQLServerFirewall' +$script:DSCModuleName = 'SQLServerDSC' +$script:DSCResourceName = 'MSFT_SqlWindowsFirewall' #region HEADER @@ -405,7 +405,7 @@ try SourceCredential = $mockSourceCredential } - Describe "xSQLServerFirewall\Get-TargetResource" -Tag 'Get' { + Describe "SqlWindowsFirewall\Get-TargetResource" -Tag 'Get' { # Local path to TestDrive:\ $mockSourcePath = $TestDrive.FullName @@ -951,7 +951,7 @@ try } } - Describe "xSQLServerFirewall\Set-TargetResource" -Tag 'Set' { + Describe "SqlWindowsFirewall\Set-TargetResource" -Tag 'Set' { # Local path to TestDrive:\ $mockSourcePath = $TestDrive.FullName @@ -1192,7 +1192,7 @@ try } } - Describe "xSQLServerFirewall\Test-TargetResource" -Tag 'Test' { + Describe "SqlWindowsFirewall\Test-TargetResource" -Tag 'Test' { # Local path to TestDrive:\ $mockSourcePath = $TestDrive.FullName diff --git a/Tests/Unit/xSQLServerHelper.Tests.ps1 b/Tests/Unit/SqlServerDSCHelper.Tests.ps1 similarity index 99% rename from Tests/Unit/xSQLServerHelper.Tests.ps1 rename to Tests/Unit/SqlServerDSCHelper.Tests.ps1 index e8fb6d30b..74c334dd0 100644 --- a/Tests/Unit/xSQLServerHelper.Tests.ps1 +++ b/Tests/Unit/SqlServerDSCHelper.Tests.ps1 @@ -4,7 +4,7 @@ param () # Unit Test Template Version: 1.1.0 -$script:moduleName = 'xSQLServerHelper' +$script:moduleName = 'SqlServerDSCHelper' [String] $script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` @@ -14,7 +14,7 @@ if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCR } Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force -Import-Module (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent | Split-Path -Parent) -ChildPath 'xSQLServerHelper.psm1') -Scope Global -Force +Import-Module (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent | Split-Path -Parent) -ChildPath 'SqlServerDSCHelper.psm1') -Scope Global -Force # Loading mocked classes Add-Type -Path ( Join-Path -Path ( Join-Path -Path $PSScriptRoot -ChildPath Stubs ) -ChildPath SMO.cs ) @@ -786,7 +786,7 @@ InModuleScope $script:moduleName { Assert-VerifiableMock } - $mockApplicationDomainName = 'xSQLServerHelperTests' + $mockApplicationDomainName = 'SqlServerDSCHelperTests' $mockApplicationDomainObject = [System.AppDomain]::CreateDomain($mockApplicationDomainName) <# @@ -836,7 +836,7 @@ InModuleScope $script:moduleName { } -Verifiable Mock -CommandName Register-SqlSmo -MockWith { - [System.AppDomain]::CreateDomain('xSQLServerHelper') + [System.AppDomain]::CreateDomain('SqlServerDSCHelper') } -ParameterFilter { $SQLInstanceName -eq $mockInstanceName } -Verifiable diff --git a/Tests/Unit/Stubs/SMO.cs b/Tests/Unit/Stubs/SMO.cs index 00e4789d1..1a47a84d4 100644 --- a/Tests/Unit/Stubs/SMO.cs +++ b/Tests/Unit/Stubs/SMO.cs @@ -14,7 +14,7 @@ namespace Microsoft.SqlServer.Management.Smo // TypeName: Microsoft.SqlServer.Management.Smo.LoginCreateOptions // Used by: - // MSFT_xSQLServerLogin.Tests.ps1 + // MSFT_SqlServerLogin.Tests.ps1 public enum LoginCreateOptions { None = 0, @@ -25,7 +25,7 @@ public enum LoginCreateOptions // TypeName: Microsoft.SqlServer.Management.Smo.LoginType // BaseType: Microsoft.SqlServer.Management.Smo.ScriptNameObjectBase // Used by: - // MSFT_xSQLServerLogin + // MSFT_SqlServerLogin public enum LoginType { AsymmetricKey = 4, @@ -60,7 +60,7 @@ public enum AvailabilityReplicaAvailabilityMode // TypeName: Microsoft.SqlServer.Management.Smo.EndpointType // Used by: - // xSQLServerEndpoint + // SqlServerEndpoint public enum EndpointType { DatabaseMirroring, @@ -71,7 +71,7 @@ public enum EndpointType // TypeName: Microsoft.SqlServer.Management.Smo.ProtocolType // Used by: - // xSQLServerEndpoint + // SqlServerEndpoint public enum ProtocolType { Http, @@ -83,7 +83,7 @@ public enum ProtocolType // TypeName: Microsoft.SqlServer.Management.Smo.ServerMirroringRole // Used by: - // xSQLServerEndpoint + // SqlServerEndpoint public enum ServerMirroringRole { All, @@ -94,7 +94,7 @@ public enum ServerMirroringRole // TypeName: Microsoft.SqlServer.Management.Smo.EndpointEncryption // Used by: - // xSQLServerEndpoint + // SqlServerEndpoint public enum EndpointEncryption { Disabled, @@ -104,7 +104,7 @@ public enum EndpointEncryption // TypeName: Microsoft.SqlServer.Management.Smo.EndpointEncryptionAlgorithm // Used by: - // xSQLServerEndpoint + // SqlServerEndpoint public enum EndpointEncryptionAlgorithm { Aes, @@ -127,7 +127,7 @@ public class Globals // Typename: Microsoft.SqlServer.Management.Smo.ObjectPermissionSet // BaseType: Microsoft.SqlServer.Management.Smo.PermissionSetBase // Used by: - // xSQLServerEndpointPermission.Tests.ps1 + // SqlServerEndpointPermission.Tests.ps1 public class ObjectPermissionSet { public ObjectPermissionSet(){} @@ -144,7 +144,7 @@ public ObjectPermissionSet( // TypeName: Microsoft.SqlServer.Management.Smo.ServerPermissionSet // BaseType: Microsoft.SqlServer.Management.Smo.PermissionSetBase // Used by: - // xSQLServerPermission.Tests.ps1 + // SqlServerPermission.Tests.ps1 public class ServerPermissionSet { public ServerPermissionSet(){} @@ -170,7 +170,7 @@ public ServerPermissionSet( // TypeName: Microsoft.SqlServer.Management.Smo.ServerPermissionInfo // BaseType: Microsoft.SqlServer.Management.Smo.PermissionInfo // Used by: - // xSQLServerPermission.Tests.ps1 + // SqlServerPermission.Tests.ps1 public class ServerPermissionInfo { public ServerPermissionInfo() @@ -192,7 +192,7 @@ public ServerPermissionInfo( // TypeName: Microsoft.SqlServer.Management.Smo.DatabasePermissionSet // BaseType: Microsoft.SqlServer.Management.Smo.PermissionSetBase // Used by: - // xSQLServerDatabasePermission.Tests.ps1 + // SqlDatabasePermission.Tests.ps1 public class DatabasePermissionSet { public DatabasePermissionSet(){} @@ -210,7 +210,7 @@ public DatabasePermissionSet( bool connect, bool update ) // TypeName: Microsoft.SqlServer.Management.Smo.DatabasePermissionInfo // BaseType: Microsoft.SqlServer.Management.Smo.PermissionInfo // Used by: - // xSQLServerDatabasePermission.Tests.ps1 + // SqlDatabasePermission.Tests.ps1 public class DatabasePermissionInfo { public DatabasePermissionInfo() @@ -231,8 +231,8 @@ public DatabasePermissionInfo( Microsoft.SqlServer.Management.Smo.DatabasePermis // TypeName: Microsoft.SqlServer.Management.Smo.Server // BaseType: Microsoft.SqlServer.Management.Smo.SqlSmoObject // Used by: - // xSQLServerPermission - // MSFT_xSQLServerLogin + // SqlServerPermission + // MSFT_SqlServerLogin public class Server { public string MockGranteeName; @@ -340,7 +340,7 @@ public void Revoke( Microsoft.SqlServer.Management.Smo.ServerPermissionSet permi // TypeName: Microsoft.SqlServer.Management.Smo.Login // BaseType: Microsoft.SqlServer.Management.Smo.ScriptNameObjectBase // Used by: - // MSFT_xSQLServerLogin + // MSFT_SqlServerLogin public class Login { private bool _mockPasswordPassed = false; @@ -524,7 +524,7 @@ public void Drop() // TypeName: Microsoft.SqlServer.Management.Smo.ServerRole // BaseType: Microsoft.SqlServer.Management.Smo.ScriptNameObjectBase // Used by: - // MSFT_xSQLServerRole + // MSFT_SqlServerRole public class ServerRole { public ServerRole( Server server, string name ) { @@ -542,9 +542,9 @@ public ServerRole( Object server, string name ) { // TypeName: Microsoft.SqlServer.Management.Smo.Database // BaseType: Microsoft.SqlServer.Management.Smo.ScriptNameObjectBase // Used by: - // MSFT_xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership - // MSFT_xSQLServerDatabase - // MSFT_xSQLServerDatabasePermission + // MSFT_SqlAGDatabaseMembership + // MSFT_SqlDatabase + // MSFT_SqlDatabasePermission public class Database { public bool AutoClose = false; @@ -630,7 +630,7 @@ public void Deny( Microsoft.SqlServer.Management.Smo.DatabasePermissionSet permi // TypeName: Microsoft.SqlServer.Management.Smo.User // BaseType: Microsoft.SqlServer.Management.Smo.ScriptNameObjectBase // Used by: - // xSQLServerDatabaseRole.Tests.ps1 + // SqlDatabaseRole.Tests.ps1 public class User { public User( Server server, string name ) @@ -697,7 +697,7 @@ public FailedOperationException (string message, SmoException inner) : base (mes // TypeName: Microsoft.SqlServer.Management.Smo.AvailabilityGroup // BaseType: Microsoft.SqlServer.Management.Smo.NamedSmoObject // Used by: - // xSQLServerAlwaysOnAvailabilityGroup + // SqlServerAG public class AvailabilityGroup { public AvailabilityGroup() @@ -748,7 +748,7 @@ public AvailabilityGroup Clone() // TypeName: Microsoft.SqlServer.Management.Smo.AvailabilityReplica // BaseType: Microsoft.SqlServer.Management.Smo.NamedSmoObject // Used by: - // xSQLServerAlwaysOnAvailabilityGroup + // SqlAG public class AvailabilityReplica { public AvailabilityReplica() @@ -782,7 +782,7 @@ public void Create() // TypeName: Microsoft.SqlServer.Management.Common.ServerConnection // Used by: - // xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership + // SqlAGDatabases public class ConnectionContext { public string TrueLogin; @@ -793,7 +793,7 @@ public void Create() // TypeName: Microsoft.SqlServer.Management.Smo.AvailabilityDatabase // Used by: - // xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership + // SqlAGDatabases public class AvailabilityDatabase { public string Name; @@ -803,7 +803,7 @@ public void Create() {} // TypeName: Microsoft.SqlServer.Management.Smo.DatabaseCollection // Used by: - // xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership + // SqlAGDatabases public class DatabaseCollection : Collection { public Database this[string name] @@ -825,7 +825,7 @@ public Database this[string name] // TypeName: Microsoft.SqlServer.Management.Smo.AvailabilityReplicaCollection // Used by: - // xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership + // SqlAGDatabases public class AvailabilityReplicaCollection : Collection { public AvailabilityReplica this[string name] @@ -847,7 +847,7 @@ public AvailabilityReplica this[string name] // TypeName: Microsoft.SqlServer.Management.Smo.DatabaseEncryptionKey // Used by: - // xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership + // SqlAGDatabases public class DatabaseEncryptionKey { public string EncryptorName; @@ -856,7 +856,7 @@ public class DatabaseEncryptionKey // TypeName: Microsoft.SqlServer.Management.Smo.Certificate // Used by: - // xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership + // SqlAGDatabaseMembership public class Certificate { public byte[] Thumbprint; @@ -864,7 +864,7 @@ public class Certificate // TypeName: Microsoft.SqlServer.Management.Smo.AvailabilityDatabaseCollection // Used by: - // xSQLServerAlwaysOnAvailabilityGroupDatabaseMembership + // SqlAGDatabaseMembership public class AvailabilityDatabaseCollection : Collection { public AvailabilityDatabase this[string name] @@ -886,7 +886,7 @@ public AvailabilityDatabase this[string name] // TypeName: Microsoft.SqlServer.Management.Smo.AvailabilityGroupCollection // Used by: - // xSQLServerAlwaysOnAvailabilityGroup + // SqlAG public class AvailabilityGroupCollection : Collection { public AvailabilityGroup this[string name] @@ -908,7 +908,7 @@ public AvailabilityGroup this[string name] // TypeName: Microsoft.SqlServer.Management.Smo.Endpoint // Used by: - // xSQLServerAlwaysOnAvailabilityGroup + // SqlAG public class Endpoint { public string Name; @@ -918,7 +918,7 @@ public class Endpoint // TypeName: Microsoft.SqlServer.Management.Smo.EndpointCollection // Used by: - // xSQLServerAlwaysOnAvailabilityGroup + // SqlAG public class EndpointCollection : Collection { public Endpoint this[string name] @@ -947,7 +947,7 @@ namespace Microsoft.SqlServer.Management.Smo.Wmi // TypeName: Microsoft.SqlServer.Management.Smo.Wmi.ManagedServiceType // Used by: - // MSFT_xSQLServerServiceAccount.Tests.ps1 + // MSFT_SqlServerServiceAccount.Tests.ps1 public enum ManagedServiceType { SqlServer = 1, diff --git a/appveyor.yml b/appveyor.yml index bbd5098b9..d890750f8 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,7 +1,7 @@ #---------------------------------# # environment configuration # #---------------------------------# -version: 6.0.{build}.0 +version: 9.0.{build}.0 image: Visual Studio 2017 install: - git clone https://github.com/PowerShell/DscResource.Tests diff --git a/en-US/xSQLServerHelper.strings.psd1 b/en-US/SqlServerDSCHelper.strings.psd1 similarity index 99% rename from en-US/xSQLServerHelper.strings.psd1 rename to en-US/SqlServerDSCHelper.strings.psd1 index 58c7a27af..6c8f3bd6b 100644 --- a/en-US/xSQLServerHelper.strings.psd1 +++ b/en-US/SqlServerDSCHelper.strings.psd1 @@ -1,4 +1,4 @@ -# Localized resources for helper module xSQLServerHelper. +# Localized resources for helper module SqlServerHelper. ConvertFrom-StringData @' ConnectedToDatabaseEngineInstance = Connected to SQL instance '{0}'. diff --git a/sv-SE/xSQLServerHelper.strings.psd1 b/sv-SE/SqlServerDSCHelper.strings.psd1 similarity index 99% rename from sv-SE/xSQLServerHelper.strings.psd1 rename to sv-SE/SqlServerDSCHelper.strings.psd1 index 78ac75278..e192a2252 100644 --- a/sv-SE/xSQLServerHelper.strings.psd1 +++ b/sv-SE/SqlServerDSCHelper.strings.psd1 @@ -1,4 +1,4 @@ -# Swedish localized resources for helper module xSQLServerHelper. +# Swedish localized resources for helper module SqlServerDSCHelper. ConvertFrom-StringData @' ConnectedToDatabaseEngineInstance = Ansluten till SQL instans '{0}'. diff --git a/xSQLServer.zip b/xSQLServer.zip deleted file mode 100644 index 7b08f7ccc03ced0f0c61977f0675e3aa800d4723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 404541 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 z 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%0D#$1008Fy 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