DSCResources/MSFT_xClusterProperty/MSFT_xClusterProperty.psm1

Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) `
        -ChildPath 'CommonResourceHelper.psm1')

$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_xClusterProperty'

<#
    .SYNOPSIS
        Configures cluster properties.
 
    .PARAMETER Name
        Name of the cluster.
#>

function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [Parameter(Mandatory = $true)]
        [System.String]
        $Name
    )

    Write-Verbose -Message ($script:localizedData.GettingClusterProperties -f $Name)

    $cluster = Get-Cluster -Name $Name
    $returnValue = @{
    Name                        = $Name
    AddEvictDelay               = $cluster.AddEvictDelay
    ClusterLogLevel             = $cluster.ClusterLogLevel
    ClusterLogSize              = $cluster.ClusterLogSize
    CrossSiteDelay              = $cluster.CrossSiteDelay
    CrossSiteThreshold          = $cluster.CrossSiteThreshold
    Description                 = $cluster.Description
    CrossSubnetDelay            = $cluster.CrossSubnetDelay
    CrossSubnetThreshold        = $cluster.CrossSubnetThreshold
    DatabaseReadWriteMode       = $cluster.DatabaseReadWriteMode
    DefaultNetworkRole          = $cluster.DefaultNetworkRole
    DrainOnShutdown             = $cluster.DrainOnShutdown
    DynamicQuorum               = $cluster.DynamicQuorum
    NetftIPSecEnabled           = $cluster.NetftIPSecEnabled
    QuarantineDuration          = $cluster.QuarantineDuration
    PreferredSite               = $cluster.PreferredSite
    QuarantineThreshold         = $cluster.QuarantineThreshold
    SameSubnetDelay             = $cluster.SameSubnetDelay
    SameSubnetThreshold         = $cluster.SameSubnetThreshold
    ShutdownTimeoutInMinutes    = $cluster.ShutdownTimeoutInMinutes
    }

    return $returnValue
}
<#
    .SYNOPSIS
        Configures cluster properties.
 
    .PARAMETER AddEvictDelay
        Specifies how many seconds after a node is evicted that the failover cluster service will wait before adding a new node.
 
    .PARAMETER ClusterLogLevel
        Controls the level of cluster logging.
 
    .PARAMETER ClusterLogSize
        Controls the maximum size of the cluster log files on each of the nodes.
 
    .PARAMETER CrossSiteDelay
        Controls the time interval, in milliseconds, that the cluster network driver waits between sending Cluster Service heartbeats across sites.
 
    .PARAMETER CrossSiteThreshold
        Controls how many Cluster Service heartbeats can be missed across sites before it determines that Cluster Service has stopped responding.
 
    .PARAMETER CrossSubnetDelay
        Controls the time interval, in milliseconds, that the cluster network driver waits between sending Cluster Service heartbeats across subnets.
 
    .PARAMETER CrossSubnetThreshold
        Controls how many Cluster Service heartbeats can be missed across subnets before it determines that Cluster Service has stopped responding.
 
    .PARAMETER DatabaseReadWriteMode
        Specifies the read/write mode for the cluster database.
 
    .PARAMETER DefaultNetworkRole
        Specifies the role that the cluster automatically assigns to any newly discovered or created network.
 
    .PARAMETER Description
        Stores administrative comments about the cluster. The following table summarizes the attributes of the Description property.
 
    .PARAMETER DrainOnShutdown
        Specifies whether to enable Node Drain for a cluster.
 
    .PARAMETER DynamicQuorum
        Enables the cluster to change the required number of nodes that need to participate in quorum when nodes shut down or crash.
 
    .PARAMETER Name
        Name of the cluster.
 
    .PARAMETER NetftIPSecEnabled
        Specifies whether Internet Protocol Security (IPSec) encryption is enabled for inter-node cluster communication.
 
    .PARAMETER PreferredSite
        Specifies the preferred site for a site-aware cluster.
 
    .PARAMETER QuarantineDuration
        Specifies the quarantine duration for a node, in seconds.
 
    .PARAMETER QuarantineThreshold
        Specifies the quarantine threshold for a node, in minutes.
 
    .PARAMETER SameSubnetDelay
        Controls the delay, in milliseconds, between netft heartbeats.
 
    .PARAMETER SameSubnetThreshold
        Controls how many heartbeats can be missed on the same subnet before the route is declared as unreachable.
 
    .PARAMETER ShutdownTimeoutInMinutes
        Specifies how many minutes after a system shutdown is initiated that the failover cluster service will wait for resources to go offline.
#>

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

        [Parameter()]
        [System.UInt32]
        $AddEvictDelay,

        [Parameter()]
        [System.UInt32]
        $ClusterLogLevel,

        [Parameter()]
        [System.UInt32]
        $ClusterLogSize,

        [Parameter()]
        [System.UInt32]
        $CrossSiteDelay,

        [Parameter()]
        [System.UInt32]
        $CrossSiteThreshold,

        [Parameter()]
        [System.UInt32]
        $CrossSubnetDelay,

        [Parameter()]
        [System.UInt32]
        $CrossSubnetThreshold,

        [Parameter()]
        [System.UInt32]
        $DatabaseReadWriteMode,

        [Parameter()]
        [System.UInt32]
        $DefaultNetworkRole,

        [Parameter()]
        [System.String]
        $Description,

        [Parameter()]
        [System.UInt32]
        $DrainOnShutdown,

        [Parameter()]
        [System.UInt32]
        $DynamicQuorum,

        [Parameter()]
        [System.UInt32]
        $NetftIPSecEnabled,

        [Parameter()]
        [System.String]
        $PreferredSite,

        [Parameter()]
        [System.UInt32]
        $QuarantineDuration,

        [Parameter()]
        [System.UInt32]
        $QuarantineThreshold,

        [Parameter()]
        [System.UInt32]
        $SameSubnetDelay,

        [Parameter()]
        [System.UInt32]
        $SameSubnetThreshold,

        [Parameter()]
        [System.UInt32]
        $ShutdownTimeoutInMinutes
    )

    Write-Verbose -Message ($script:localizedData.SettingClusterProperties)

    $boundParameters = $PSBoundParameters
    $boundParameters.Remove('Name') | Out-Null
    $boundParameters.Remove('Verbose') | Out-Null

    $cluster = Get-Cluster -Name $Name
    foreach ($boundParameter in $boundParameters.GetEnumerator())
    {
        Write-Verbose -Message ($script:localizedData.SettingClusterProperty -f $($boundParameter.Key), $boundParameter.Value)
        $cluster.$($boundParameter.Key) = $boundParameter.Value
    }
}
<#
    .SYNOPSIS
        Configures cluster properties.
 
    .PARAMETER AddEvictDelay
        Specifies how many seconds after a node is evicted that the failover cluster service will wait before adding a new node.
 
    .PARAMETER ClusterLogLevel
        Controls the level of cluster logging.
 
    .PARAMETER ClusterLogSize
        Controls the maximum size of the cluster log files on each of the nodes.
 
    .PARAMETER CrossSiteDelay
        Controls the time interval, in milliseconds, that the cluster network driver waits between sending Cluster Service heartbeats across sites.
 
    .PARAMETER CrossSiteThreshold
        Controls how many Cluster Service heartbeats can be missed across sites before it determines that Cluster Service has stopped responding.
 
    .PARAMETER CrossSubnetDelay
        Controls the time interval, in milliseconds, that the cluster network driver waits between sending Cluster Service heartbeats across subnets.
 
    .PARAMETER CrossSubnetThreshold
        Controls how many Cluster Service heartbeats can be missed across subnets before it determines that Cluster Service has stopped responding.
 
    .PARAMETER DatabaseReadWriteMode
        Specifies the read/write mode for the cluster database.
 
    .PARAMETER DefaultNetworkRole
        Specifies the role that the cluster automatically assigns to any newly discovered or created network.
 
    .PARAMETER Description
        Stores administrative comments about the cluster. The following table summarizes the attributes of the Description property.
 
    .PARAMETER DrainOnShutdown
        Specifies whether to enable Node Drain for a cluster.
 
    .PARAMETER DynamicQuorum
        Enables the cluster to change the required number of nodes that need to participate in quorum when nodes shut down or crash.
 
    .PARAMETER Name
        Name of the cluster.
 
    .PARAMETER NetftIPSecEnabled
        Specifies whether Internet Protocol Security (IPSec) encryption is enabled for inter-node cluster communication.
 
    .PARAMETER PreferredSite
        Specifies the preferred site for a site-aware cluster.
 
    .PARAMETER QuarantineDuration
        Specifies the quarantine duration for a node, in seconds.
 
    .PARAMETER QuarantineThreshold
        Specifies the quarantine threshold for a node, in minutes.
 
    .PARAMETER SameSubnetDelay
        Controls the delay, in milliseconds, between netft heartbeats.
 
    .PARAMETER SameSubnetThreshold
        Controls how many heartbeats can be missed on the same subnet before the route is declared as unreachable.
 
    .PARAMETER ShutdownTimeoutInMinutes
        Specifies how many minutes after a system shutdown is initiated that the failover cluster service will wait for resources to go offline.
#>

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

        [Parameter()]
        [System.UInt32]
        $AddEvictDelay,

        [Parameter()]
        [System.UInt32]
        $ClusterLogLevel,

        [Parameter()]
        [System.UInt32]
        $ClusterLogSize,

        [Parameter()]
        [System.UInt32]
        $CrossSiteDelay,

        [Parameter()]
        [System.UInt32]
        $CrossSiteThreshold,

        [Parameter()]
        [System.UInt32]
        $CrossSubnetDelay,

        [Parameter()]
        [System.UInt32]
        $CrossSubnetThreshold,

        [Parameter()]
        [System.UInt32]
        $DatabaseReadWriteMode,

        [Parameter()]
        [System.UInt32]
        $DefaultNetworkRole,

        [Parameter()]
        [System.String]
        $Description,

        [Parameter()]
        [System.UInt32]
        $DrainOnShutdown,

        [Parameter()]
        [System.UInt32]
        $DynamicQuorum,

        [Parameter()]
        [System.UInt32]
        $NetftIPSecEnabled,

        [Parameter()]
        [System.String]
        $PreferredSite,

        [Parameter()]
        [System.UInt32]
        $QuarantineDuration,

        [Parameter()]
        [System.UInt32]
        $QuarantineThreshold,

        [Parameter()]
        [System.UInt32]
        $SameSubnetDelay,

        [Parameter()]
        [System.UInt32]
        $SameSubnetThreshold,

        [Parameter()]
        [System.UInt32]
        $ShutdownTimeoutInMinutes
    )

    Write-Verbose -Message ($script:localizedData.GettingClusterProperties -f $Name)

    $boundParameters = $PSBoundParameters
    $boundParameters.Remove('Name') | Out-Null
    $boundParameters.Remove('Result') | Out-Null
    $boundParameters.Remove('Verbose') | Out-Null
    $boundParameters.Remove('Debug') | Out-Null

    $cluster = Get-Cluster -Name $Name

    $output = $true

    foreach ($boundParameter in $boundParameters.GetEnumerator())
    {
        if($cluster.$($boundParameter.Key) -ne $boundParameter.Value)
        {
            Write-Debug -Message ($script:localizedData.IncorrectClusterProperty -f $($boundParameter.Key), $cluster.$($boundParameter.Key), $boundParameter.Value)
            Write-Verbose -Message ($script:localizedData.IncorrectClusterProperty -f $($boundParameter.Key), $cluster.$($boundParameter.Key), $boundParameter.Value)
            $output = $false
        }
    }

    return $output
}

Export-ModuleMember -Function *-TargetResource