DSCClassResources/ClusterParameter/ClusterParameter.psm1

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

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

    [DscProperty(Mandatory)]
    [String]$Value

    [DscProperty(Key)]
    [String]$ClusterResourceName

    [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.PropertyName).Value
        $this.Type = ($clusterResource | Get-ClusterParameter -Name $this.PropertyName).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.PropertyName)"
        $ClusterResource = Get-ClusterResource -Name $this.ClusterResourceName 
        $ClusterResource | Set-ClusterParameter -Name $this.PropertyName -Value $this.Value
        Write-Verbose -Message 'Restarting network name ressource (synchronously)'
        Stop-ClusterResource -Name $this.ClusterResourceName
        Write-Verbose -Message 'Starting Cluster Group of modified resource'
        Start-ClusterGroup -Name $ClusterResource.OwnerGroup
    }
    
    # Tests if the resource is in the desired state.
    [bool] Test() {
        try {
            $clusterResource = Get-ClusterResource -Name $this.ClusterResourceName
            $currentValue = ($clusterResource | Get-ClusterParameter -Name $this.PropertyName).Value
            switch ($this.PropertyName) {
                "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
        }
    }
}