DSCClassResources/ClusterParameter/ClusterParameter.psm1

[DscResource()]
class ClusterParameter {
    [DscProperty(Mandatory)]
    [string] $ClusterName

    [DscProperty(Mandatory=$false)]
    [String]$NodeName = $env:COMPUTERNAME

    [DscProperty(Key)]
    [String]$Key

    [DscProperty(Mandatory)]
    [String]$Value

    [DscProperty(Mandatory=$false)]
    [String]$ClusterResourceName = 'Cluster Name'

    [DscProperty(NotConfigurable)]
    [String]$Type

    
    # Gets the resource's current state.
    [ClusterParameter] Get() {
        $clusterResource = Get-ClusterResource -Name $this.ClusterResourceName
        $this.Value = ($clusterResource | Get-ClusterParameter -Name $this.key).Value
        $this.Type = ($clusterResource | Get-ClusterParameter -Name $this.key).ParameterType
        return $this
    }
    
    # Sets the desired state of the resource.
    [void] Set() {
        $clusterResource = Get-ClusterResource -Name $this.ClusterResourceName
        Write-Verbose "Cluster Resource is: $($clusterResource.Name)"
        Write-Verbose "Parameter Type is $($this.key)"
        Get-ClusterResource -Name $this.ClusterResourceName | Set-ClusterParameter -Name $this.Key -Value $this.Value
        Write-Verbose -Message 'Restarting network name ressource (synchronously)'
        Stop-ClusterResource -Name $this.ClusterResourceName
        Start-ClusterResource -Name $this.ClusterResourceName
    }
    
    # Tests if the resource is in the desired state.
    [bool] Test() {
        try {
            $clusterResource = Get-ClusterResource -Name $this.ClusterResourceName
            $currentValue = ($clusterResource | Get-ClusterParameter -Name $this.key).Value
            switch ($this.Key) {
                "Address" {
                    $ipAddress = ($this.Value -split "/")[0]
                    if ($currentValue -eq $ipAddress) {
                        return $true
                    } 
                    else {
                        return $false
                    }
                }
                default {
                    if ($currentValue -eq $this.Value) {
                        return $true
                    } 
                    else {
                        return $false
                    }
                }
            }
            return $false
        }
        catch {
            Write-Verbose "Could not resolve Cluster Resource"
            return $false
        }
    }
}