Skip to content

Commit

Permalink
Merge pull request #63 from johlju/fix-appveyor-issues
Browse files Browse the repository at this point in the history
xFailOverCluster: Fixed failing tests in AppVeyor
Fixes #50 and #55
  • Loading branch information
bgelens authored Jun 14, 2017
2 parents 3ec8570 + 9207d13 commit ce7af36
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 134 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,49 +9,52 @@ function Get-TargetResource
{
[OutputType([Hashtable])]
param
(
[parameter(Mandatory)]
(
[Parameter(Mandatory = $true)]
[string]
$ClusterGroup,

[parameter(Mandatory)]
[parameter(Mandatory = $true)]
[string]
$Clustername,
$ClusterName,

[parameter(Mandatory)]
[Parameter(Mandatory = $true)]
[string[]]
$Nodes,

[Parameter()]
[string[]]
$ClusterResources,

[Parameter()]
[ValidateSet('Present', 'Absent')]
[String]
$Ensure = 'Present'
)

Write-Verbose -Message "Retrieving Owner information for cluster $Clustername..."

$ownernodes = @(

Write-Verbose -Message "Retrieving Owner information for cluster $ClusterName..."

$ownerNodes = @(

Write-Verbose -Message "Retrieving Owner information for Cluster Group $ClusterGroup"
(((Get-ClusterGroup -cluster $Clustername)| Where-Object {$_.name -like "$ClusterGroup"} | Get-ClusterOwnerNode).ownernodes).name
(((Get-ClusterGroup -Cluster $ClusterName) | Where-Object -FilterScript {$_.Name -like "$ClusterGroup"} | Get-ClusterOwnerNode).OwnerNodes).Name

if ($ClusterResources)
{
foreach ($resource in $ClusterResources)
{
Write-Verbose -Message "Retrieving Owner information for Cluster Resource $resource"
(((Get-ClusterResource -cluster $Clustername)| Where-Object {$_.name -like "$resource"} | Get-ClusterOwnerNode).ownernodes).name
(((Get-ClusterResource -Cluster $ClusterName) | Where-Object -FilterScript {$_.Name -like "$resource"} | Get-ClusterOwnerNode).OwnerNodes).Name
}
}
)
$ownernodes = $ownernodes | Select-Object -Unique


$ownerNodes = $ownerNodes | Select-Object -Unique

$returnValue = @{
ClusterGroup = $ClusterGroup
Clustername = $Clustername
Nodes = $ownernodes
Clustername = $ClusterName
Nodes = $ownerNodes
ClusterResources = $ClusterResources
Ensure = $Ensure
}
Expand All @@ -65,134 +68,139 @@ function Get-TargetResource
function Set-TargetResource
{
param
(
[parameter(Mandatory)]
(
[Parameter(Mandatory = $true)]
[string]
$ClusterGroup,

[parameter(Mandatory)]
[Parameter(Mandatory = $true)]
[string]
$Clustername,
$ClusterName,

[parameter(Mandatory)]
[Parameter(Mandatory = $true)]
[string[]]
$Nodes,

[Parameter()]
[string[]]
$ClusterResources,

[Parameter()]
[ValidateSet('Present', 'Absent')]
[String]
$Ensure = 'Present'
)

Write-Verbose -Message "Retrieving all owners from cluster $Clustername"
$allnodes = (Get-ClusterNode -cluster $ClusterName).name
Write-Verbose -Message "Retrieving all owners from cluster $ClusterName"
$allNodes = (Get-ClusterNode -Cluster $ClusterName).Name

if ($Ensure -eq 'Present')
{
Write-Verbose -Message "Setting Cluster owners for Group $ClusterGroup to $nodes"
$null = (Get-ClusterGroup -cluster $ClusterName)| Where-Object {$_.name -like $ClusterGroup} | Set-ClusterOwnerNode $Nodes
$null = (Get-ClusterResource)| Where-Object {$_.OwnerGroup -like $ClusterGroup} | Set-ClusterOwnerNode $allnodes
Write-Verbose -Message "Moving Cluster Group $ClusterGroup to node $($nodes[0])"
$null = (Get-ClusterGroup -cluster $ClusterName)| Where-Object {$_.name -like $ClusterGroup} | Move-ClusterGroup -Node $Nodes[0]
Write-Verbose -Message "Setting Cluster owners for Group $ClusterGroup to $Nodes"
$null = (Get-ClusterGroup -Cluster $ClusterName) | Where-Object -FilterScript {$_.Name -like $ClusterGroup} | Set-ClusterOwnerNode -Owners $Nodes
$null = (Get-ClusterResource) | Where-Object {$_.OwnerGroup -like $ClusterGroup} | Set-ClusterOwnerNode -Owners $allNodes

Write-Verbose -Message "Moving Cluster Group $ClusterGroup to node $($Nodes[0])"
$null = (Get-ClusterGroup -Cluster $ClusterName) | Where-Object -FilterScript {$_.name -like $ClusterGroup} | Move-ClusterGroup -Node $Nodes[0]

foreach ($resource in $ClusterResources)
{
Write-Verbose -Message "Setting Cluster owners for Resource $resource to $nodes"
$null = (Get-ClusterResource -cluster $Clustername)| Where-Object {$_.name -like "$resource"} | Set-ClusterOwnerNode -owners $Nodes
Write-Verbose -Message "Setting Cluster owners for Resource $resource to $Nodes"
$null = (Get-ClusterResource -Cluster $ClusterName)| Where-Object -FilterScript {$_.Name -like "$resource"} | Set-ClusterOwnerNode -Owners $Nodes
}
}
if ($Ensure -eq 'Absent')
{

Write-Verbose -Message "Retrieving current clusterowners for group $ClusterGroup"
$currentowners = (((Get-ClusterGroup -cluster $Clustername)| Where-Object {$_.name -like "$ClusterGroup"} | Get-ClusterOwnerNode).ownernodes).name | Sort-Object -Unique
$newowners = @(
foreach ($currentowner in $currentowners)
if ($Ensure -eq 'Absent')
{
Write-Verbose -Message "Retrieving current cluster owners for group $ClusterGroup"
$currentOwners = (((Get-ClusterGroup -Cluster $ClusterName)| Where-Object -FilterScript {$_.Name -like "$ClusterGroup"} | Get-ClusterOwnerNode).OwnerNodes).Name | Sort-Object -Unique
$newOwners = @(
foreach ($currentOwner in $currentOwners)
{
if ($Nodes -notcontains $currentOwner)
{
if ($Nodes -notcontains $currentowner)
{
$currentowner
}
$currentOwner
}
)
Write-Verbose -Message "Removing owners from group $($ClusterGroup): $Nodes"
$null = (Get-ClusterGroup -cluster $ClusterName)| Where-Object {$_.name -like $ClusterGroup} | Set-ClusterOwnerNode $newowners
}
)
Write-Verbose -Message "Removing owners from group $($ClusterGroup): $Nodes"
$null = (Get-ClusterGroup -Cluster $ClusterName)| Where-Object -FilterScript {$_.Name -like $ClusterGroup} | Set-ClusterOwnerNode $newOwners

Write-Verbose -Message "Setting Cluster owners for Group $ClusterGroup to $newowners"
$null = (Get-ClusterResource)| Where-Object {$_.OwnerGroup -like $ClusterGroup} | Set-ClusterOwnerNode $allnodes
Write-Verbose -Message "Setting Cluster owners for Group $ClusterGroup to $newOwners"
$null = (Get-ClusterResource)| Where-Object -FilterScript {$_.OwnerGroup -like $ClusterGroup} | Set-ClusterOwnerNode $allNodes

Write-Verbose -Message "Moving Cluster Group $ClusterGroup to node $($newowners[0])"
$null = (Get-ClusterGroup -cluster $ClusterName)| Where-Object {$_.name -like $ClusterGroup} | Move-ClusterGroup -Node $newowners[0]
Write-Verbose -Message "Moving Cluster Group $ClusterGroup to node $($newOwners[0])"
$null = (Get-ClusterGroup -Cluster $ClusterName)| Where-Object -FilterScript {$_.Name -like $ClusterGroup} | Move-ClusterGroup -Node $newOwners[0]

foreach ($resource in $ClusterResources)
{
Write-Verbose -Message "Retrieving current clusterowners for resource $resource"
$currentowners = ((Get-ClusterResource -cluster $Clustername | Where-Object {$_.name -like "$resource"} | Get-ClusterOwnerNode).ownernodes).name | Sort-Object -Unique
$newowners = @(
foreach ($currentowner in $currentowners)
$currentOwners = ((Get-ClusterResource -Cluster $ClusterName | Where-Object -FilterScript {$_.Name -like "$resource"} | Get-ClusterOwnerNode).OwnerNodes).Name | Sort-Object -Unique
$newOwners = @(
foreach ($currentOwner in $currentOwners)
{
if ($Nodes -notcontains $currentowner)
if ($Nodes -notcontains $currentOwner)
{
$currentowner
$currentOwner
}
}
)
Write-Verbose -Message "Setting Cluster owners for Resource $resource to $newowners"
$null = Get-ClusterResource -cluster $Clustername | Where-Object {$_.name -like "$resource"} | Set-ClusterOwnerNode -owners $newowners
Write-Verbose -Message "Setting Cluster owners for Resource $resource to $newOwners"
$null = Get-ClusterResource -Cluster $ClusterName | Where-Object -FilterScript {$_.Name -like "$resource"} | Set-ClusterOwnerNode -Owners $newOwners
}
}
}
}

#
#
# Test-TargetResource
#

function Test-TargetResource
function Test-TargetResource
{
[OutputType([Boolean])]
param
(
[parameter(Mandatory)]
(
[Parameter(Mandatory = $true)]
[string]
$ClusterGroup,

[parameter(Mandatory)]
[Parameter(Mandatory = $true)]
[string]
$Clustername,
$ClusterName,

[parameter(Mandatory)]
[Parameter(Mandatory = $true)]
[string[]]
$Nodes,

[Parameter()]
[string[]]
$ClusterResources,

[Parameter()]
[ValidateSet('Present', 'Absent')]
[String]
$Ensure = 'Present'
)

Write-Verbose -Message "Testing Owner information for cluster $Clustername..."
Write-Verbose -Message "Testing Owner information for cluster $ClusterName..."

$getinfo = (Get-TargetResource @PSBoundParameters).Nodes
$getTargetResourceResult = (Get-TargetResource @PSBoundParameters).Nodes
$result = $true

if ($Ensure -eq 'Present')
{
foreach ($object in $getinfo)
{
foreach ($object in $getTargetResourceResult)
{
if ($Nodes -notcontains $object)
{
Write-Verbose -Message "$object was NOT found as possible owner"
$result = $false
}
}
foreach ($object in $nodes)

foreach ($object in $Nodes)
{
if ($getinfo -notcontains $object)
if ($getTargetResourceResult -notcontains $object)
{
Write-Verbose -Message "$object was NOT found as possible owner"
$result = $false
Expand All @@ -201,18 +209,19 @@ function Test-TargetResource
}

if ($Ensure -eq 'Absent')
{
foreach ($object in $getinfo)
{
foreach ($object in $getTargetResourceResult)
{
if ($Nodes -contains $object)
{
Write-Verbose -Message "$object WAS found as possible owner"
$result = $false
}
}
foreach ($object in $nodes)

foreach ($object in $Nodes)
{
if ($getinfo -contains $object)
if ($getTargetResourceResult -contains $object)
{
Write-Verbose -Message "$object WAS found as possible owner"
$result = $false
Expand Down
29 changes: 17 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

# xFailOverCluster

The **xFailOverCluster** DSC modules contains **xCluster** and **xWaitForCluster** resources for creating and configuring failover clusters.
The **xFailOverCluster** DSC modules contains **xCluster** and **xWaitForCluster** resources for creating and configuring failover clusters.

## Contributing
Please check out common DSC Resources [contributing guidelines](https://github.com/PowerShell/DscResource.Kit/blob/master/CONTRIBUTING.md).
Expand All @@ -23,7 +23,7 @@ Please check out common DSC Resources [contributing guidelines](https://github.c

* **IsSingleInstance** Always set to `Yes` to prevent multiple quorum settings per cluster.
* **Type** Quorum type to use: *NodeMajority*, *NodeAndDiskMajority*, *NodeAndFileShareMajority*, *DiskOnly*
* **Resource** The name of the disk or file share resource to use as witness. Is optional with *NodeMajority* type.
* **Resource** The name of the disk or file share resource to use as witness. Is optional with *NodeMajority* type.

### xClusterDisk (Unreleased)

Expand All @@ -42,6 +42,11 @@ Please check out common DSC Resources [contributing guidelines](https://github.c

### Unreleased

* Changes to xClusterPreferredOwner
* Script Analyzer warnings have been fixed (issue #50). This also failed the tests for the resource.
* Changes to xClusterDisk
* Fixed test that was failing in AppVeyor (issue #55).

### 1.6.0.0

* xCluster: Fixed bug in which failure to create a new cluster would hang
Expand Down Expand Up @@ -69,17 +74,17 @@ Please check out common DSC Resources [contributing guidelines](https://github.c

### Cluster example

In this example, we will create a failover cluster from two VMs.
We will assume that a Domain Controller already exists, and that both VMs are already domain joined.
In this example, we will create a failover cluster from two VMs.
We will assume that a Domain Controller already exists, and that both VMs are already domain joined.
Furthermore, the example assumes that your certificates are installed such that DSC can appropriately handle secrets such as the Domain Administrator Credential.
Finally, the xCluster module must also be installed on the VMs, as specified above.
For an example of an end to end scenario, check out the SQL HA Group blog post on the PowerShell Team Blog.

```powershell
Configuration ClusterDemo
{
param([Parameter(Mandatory=$true)]
[ValidateNotNullorEmpty()]
param([Parameter(Mandatory=$true)]
[ValidateNotNullorEmpty()]
[PsCredential] $domainAdminCred)
Node $AllNodes.Where{$_.Role -eq "PrimaryClusterNode" }.NodeName
Expand All @@ -93,7 +98,7 @@ Configuration ClusterDemo
WindowsFeature RSATClusteringPowerShell
{
Ensure = "Present"
Name = "RSAT-Clustering-PowerShell"
Name = "RSAT-Clustering-PowerShell"
DependsOn = "[WindowsFeature]FailoverFeature"
}
Expand All @@ -113,12 +118,12 @@ Configuration ClusterDemo
DomainAdministratorCredential = $domainAdminCred
DependsOn = “[WindowsFeature]RSATClusteringCmdInterface”
}
}
}
Node $AllNodes.Where{ $_.Role -eq "ReplicaServerNode" }.NodeName
{
{
WindowsFeature FailoverFeature
{
Ensure = "Present"
Expand All @@ -128,7 +133,7 @@ Configuration ClusterDemo
WindowsFeature RSATClusteringPowerShell
{
Ensure = "Present"
Name = "RSAT-Clustering-PowerShell"
Name = "RSAT-Clustering-PowerShell"
DependsOn = "[WindowsFeature]FailoverFeature"
}
Expand All @@ -147,7 +152,7 @@ Configuration ClusterDemo
RetryIntervalSec = 10
RetryCount = 60
DependsOn = “[WindowsFeature]RSATClusteringCmdInterface”
DependsOn = “[WindowsFeature]RSATClusteringCmdInterface”
}
xCluster joinCluster
Expand All @@ -157,7 +162,7 @@ Configuration ClusterDemo
DomainAdministratorCredential = $domainAdminCred
DependsOn = "[xWaitForCluster]waitForCluster"
}
}
}
}
Expand Down
Loading

0 comments on commit ce7af36

Please sign in to comment.