DSCResources/MSFT_xWaitForAvailabilityGroup/MSFT_xWaitForAvailabilityGroup.psm1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
$currentPath = Split-Path -Parent $MyInvocation.MyCommand.Path
Write-Verbose -Message "CurrentPath: $currentPath"

# Load Common Code
Import-Module $currentPath\..\..\xSQLServerHelper.psm1 -Verbose:$false -ErrorAction Stop

function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $Name,
        
        [UInt64] $RetryIntervalSec = 10,
        [UInt32] $RetryCount = 50
    )

    @{
        Name = $Name
        RetryIntervalSec = $RetryIntervalSec
        RetryCount = $RetryCount
    }
}


function Set-TargetResource
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $Name,

        [System.UInt64]
        $RetryIntervalSec =20,

        [System.UInt32]
        $RetryCount = 6
    )

    $AGFound = $false
    New-VerboseMessage -Message "Checking for Availaibilty Group $Name ..."

    for ($count = 0; $count -lt $RetryCount; $count++)
    {
        try
        {
            $clusterGroup = Get-ClusterGroup -Name $Name -ErrorAction Ignore

            if ($clusterGroup -ne $null)
            {
                New-VerboseMessage -Message "Found Availability Group $Name"
                $AGFound = $true
                Start-Sleep -Seconds $RetryIntervalSec
                break;
            }
            
        }
        catch
        {
             New-VerboseMessage -Message "Availability Group $Name not found. Will retry again after $RetryIntervalSec sec"
        }
            
        New-VerboseMessage -Message "Availability Group $Name not found. Will retry again after $RetryIntervalSec sec"
        Start-Sleep -Seconds $RetryIntervalSec
    }

    if (! $AGFound)
    {
        throw "Availability Group $Name not found after $count attempts with $RetryIntervalSec sec interval"
        Exit
    }


}


function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $Name,

        [System.UInt64]
        $RetryIntervalSec = 10,

        [System.UInt32]
        $RetryCount = 50
    )

    New-VerboseMessage -Message "Checking for Availability Group $Name ..."

    try
    {

        $clusterGroup = Get-ClusterGroup -Name $Name -ErrorAction Ignore

        if ($clusterGroup -eq $null)
        {
            New-VerboseMessage -Message "Availability Group $Name not found"
            $false
        }
        else
        {
            New-VerboseMessage -Message "Found Availabilty Group $Name"
            $true
        }
    }
    catch
    {
        New-VerboseMessage -Message "Availability Group $Name not found"
        $false
    }
}


Export-ModuleMember -Function *-TargetResource