DSCResources/xFailOverCluster/1.5.0.0/DSCResources/MSFT_xClusterNetwork/MSFT_xClusterNetwork.psm1


function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([Hashtable])]
    param
    (
        [Parameter(Mandatory = $true)]
        [String] $Address,

        [Parameter(Mandatory = $true)]
        [String] $AddressMask,

        [Parameter(Mandatory = $false)]
        [String] $Name,

        [Parameter(Mandatory = $false)]
        [ValidateSet("0","1","3")]
        [String] $Role,

        [Parameter(Mandatory = $false)]
        [String] $Metric
    )

    $NetworkResource = Get-ClusterNetwork | Where-Object { $_.Address -eq $Address -and $_.AddressMask -eq $AddressMask }

    @{
        Address     = $Address
        AddressMask = $AddressMask
        Name        = $NetworkResource.Name
        Role        = $NetworkResource.Role
        Metric      = $NetworkResource.Metric
    }
}

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

        [Parameter(Mandatory = $true)]
        [String] $AddressMask,

        [Parameter(Mandatory = $false)]
        [String] $Name,

        [Parameter(Mandatory = $false)]
        [ValidateSet("0","1","3")]
        [String] $Role,

        [Parameter(Mandatory = $false)]
        [String] $Metric
    )

    
    if (-not (Test-TargetResource -Address $Address -AddressMask $AddressMask -Name $Name -Role $Role -Metric $Metric))
    {
        $CurrentNetwork = Get-TargetResource -Address $Address -AddressMask $AddressMask

        if ($PSBoundParameters.ContainsKey('Name') -and $CurrentNetwork.Name -ne $Name)
        {
            Write-Verbose "Update the name of network $Address/$AddressMask to '$Name'"

            $NetworkResource = Get-ClusterNetwork | Where-Object { $_.Address -eq $Address -and $_.AddressMask -eq $AddressMask }
            $NetworkResource.Name = $Name
            $NetworkResource.Update()
        }

        if ($PSBoundParameters.ContainsKey('Role') -and $CurrentNetwork.Role -ne $Role)
        {
            Write-Verbose "Update the role of network $Address/$AddressMask to '$Role'"

            $NetworkResource = Get-ClusterNetwork | Where-Object { $_.Address -eq $Address -and $_.AddressMask -eq $AddressMask }
            $NetworkResource.Role = $Role
            $NetworkResource.Update()
        }

        if ($PSBoundParameters.ContainsKey('Metric') -and $CurrentNetwork.Metric -ne $Metric)
        {
            Write-Verbose "Update the metric of network $Address/$AddressMask to '$Metric'"

            $NetworkResource = Get-ClusterNetwork | Where-Object { $_.Address -eq $Address -and $_.AddressMask -eq $AddressMask }
            $NetworkResource.Metric = $Metric
            $NetworkResource.Update()
        }
    }
}

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

        [Parameter(Mandatory = $true)]
        [String] $AddressMask,

        [Parameter(Mandatory = $false)]
        [String] $Name,

        [Parameter(Mandatory = $false)]
        [ValidateSet("0","1","3")]
        [String] $Role,

        [Parameter(Mandatory = $false)]
        [String] $Metric
    )

    $CurrentNetwork = Get-TargetResource -Address $Address -AddressMask $AddressMask

    return (
        (($Name -eq $CurrentNetwork.Name) -or (-not $PSBoundParameters.ContainsKey('Name'))) -and
        (($Role -eq $CurrentNetwork.Role) -or (-not $PSBoundParameters.ContainsKey('Role'))) -and
        (($Metric -eq $CurrentNetwork.Metric) -or (-not $PSBoundParameters.ContainsKey('Metric')))
    )
}

Export-ModuleMember -Function *-TargetResource