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)" switch ($this.Key) { "Address" { if ($this.Value -match "^\d{1,3}(\.\d{1,3}){3}/\d{1,2}$") { Write-Verbose "Parameter Type is IP Address" $networkName = ($clusterResource |get-ClusterParameter Network).value $ipAddress = ($this.Value -split "/")[0] $subnetCidr = ($this.Value -split "/")[1] -as [int] $subnetMask = ([ipaddress]([double]4294967296-(1-shl32-$subnetCidr))).IPAddressToString Write-Verbose "IP Address will be: $ipAddress" Write-Verbose "Subnet mask will be: $subnetMask" $parameterNetwork = New-Object Microsoft.FailoverClusters.PowerShell.ClusterParameter $clusterResource,"Network",$networkName $parameterIp = New-Object Microsoft.FailoverClusters.PowerShell.ClusterParameter $clusterResource,"Address",$ipAddress $parameterSubnetMask = New-Object Microsoft.FailoverClusters.PowerShell.ClusterParameter $clusterResource,"SubnetMask",$subnetMask $parameterEnableDhcp = New-Object Microsoft.FailoverClusters.PowerShell.ClusterParameter $clusterResource,"EnableDhcp",0 $parameterList = $parameterIp, $parameterNetwork, $parameterSubnetMask,$parameterEnableDhcp try { $parameterList | Set-ClusterParameter } catch { Write-Verbose -Message $_.Exception.Message } } else { throw "Incorrect IP format. Expected: 192.168.0.1/24" } } default { 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 } } } |