DSCClassResources/DistributedCluster/DistributedCluster.psm1

[DscResource()]
class DistributedCluster {
    [DscProperty(Key)]
    [string]$ClusterName

    [DscProperty(Mandatory)]
    [string]$ClusterDomain

    [DscProperty(Mandatory=$false)]
    [ValidateSet("Distributed")]
    [Alias("ManagementNetworkMode")]
    [string]$ManagementPointNetworkType = "Distributed"

    [DscProperty(Mandatory=$false)]
    [ValidateSet("ActiveDirectoryAndDns")]
    [string]$AdministrativeAccessPoint = "ActiveDirectoryAndDns"

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

    [DscProperty(Mandatory=$false)]
    [string[]]$ClusterNodeArr = @()

    
    # Gets the resource's current state.
    [DistributedCluster] Get() {
        $clusterObj = Get-Cluster
        $this.ClusterDomain = $clusterObj.Domain
        $this.ClusterName = $clusterObj.Name
        $this.AdministrativeAccessPoint = $clusterObj.AdministrativeAccessPoint
        return $this
    }
    
    # Sets the desired state of the resource.
    [void] Set() {
        foreach ($node in $this.ClusterNodeArr) {
            Write-Verbose "Checking Cluster Node: $node"
            try {
                $clusterObj = Get-Cluster -Name $node -erroraction Stop
            }
            catch [System.Management.Automation.ActionPreferenceStopException] {
                $clusterObj = $null
            }
            if ($clusterObj) {
                Write-Verbose "Cluster already exists..."
                $clusterObj | Add-ClusterNode -Name $this.NodeName -NoStorage
                return
            }
        }
        $clusterParam = @{
            Name = $this.ClusterName
            Node = ([System.Net.Dns]::GetHostByName($this.NodeName)).Hostname
            NoStorage = $true
            #ManagementPointNetworkType = $this.ManagementNetworkMode
            AdministrativeAccessPoint = $this.AdministrativeAccessPoint
        }
        if ((Get-Command New-Cluster).Parameters.Keys -contains "ManagementPointNetworkType") {
            Write-Verbose "Adding parameter for Management Network Type"
            $clusterParam.Add("ManagementPointNetworkType",$this.ManagementPointNetworkType)
        }
        else {
            Write-Verbose "Management Network Type Parameter not supported"
        }
        Write-Verbose "Creating Cluster: $($this.ClusterName)"
        New-Cluster @clusterParam
    }
    
    # Tests if the resource is in the desired state.
    [bool] Test() {
        $isClusterNode = Test-Path -Path 'HKLM:\Cluster'
        return $isClusterNode
    }
}