resources/JHP_ScomAlertResolutionSetting.ps1

[DscResource()]
class ScomAlertResolutionSetting : ResourceBase
{
    [DscProperty(Key)] [ValidateSet('yes')] [string] $IsSingleInstance
    [DscProperty()] [int] $AlertAutoResolveDays
    [DscProperty()] [int] $HealthyAlertAutoResolveDays
    [DscProperty(NotConfigurable)] [Reason[]] $Reasons

    [ScomAlertResolutionSetting] Get()
    {
        $reasonList = @()
        $setting = Get-ScomAlertResolutionSetting

        if ($this.AlertAutoResolveDays -gt 0 -and $setting.AlertAutoResolveDays -ne $this.AlertAutoResolveDays)
        {
            $reasonList += @{
                Code   = 'ScomAlertResolutionSetting:ScomAlertResolutionSetting:WrongAutoResolveSetting'
                Phrase = "Auto resolve setting is $($setting.AlertAutoResolveDays) but should be $($this.AlertAutoResolveDays)"
            }
        }

        if ($this.HealthyAlertAutoResolveDays -gt 0 -and $setting.HealthyAlertAutoResolveDays -ne $this.HealthyAlertAutoResolveDays)
        {
            $reasonList += @{
                Code   = 'ScomAlertResolutionSetting:ScomAlertResolutionSetting:WrongHealthyAutoResolveSetting'
                Phrase = "Healthy auto resolve setting is $($setting.HealthyAlertAutoResolveDays) but should be $($this.HealthyAlertAutoResolveDays)"
            }
        }

        return @{
            IsSingleInstance            = $this.IsSingleInstance
            AlertAutoResolveDays        = $setting.AlertAutoResolveDays
            HealthyAlertAutoResolveDays = $setting.HealthyAlertAutoResolveDays
            Reasons                     = $reasonList
        }      
    }

    [void] Set()
    {
        $parameters = @{
            ErrorAction = 'Stop'
        }
    
        if ($this.AlertAutoResolveDays -le 0 -and $this.HealthyAlertAutoResolveDays -le 0)
        {
            return
        }
    
        if ($this.AlertAutoResolveDays -gt 0)
        {
            $parameters['AlertAutoResolveDays'] = $this.AlertAutoResolveDays
        }
    
        if ($this.HealthyAlertAutoResolveDays -gt 0)
        {
            $parameters['HealthyAlertAutoResolveDays'] = $this.HealthyAlertAutoResolveDays
        }
    
        Set-ScomAlertResolutionSetting @parameters     
    }

    [bool] Test()
    {    
        return ($this.Get().Reasons.Count -eq 0)
    }

    [Hashtable] GetConfigurableDscProperties()
    {
        # This method returns a hashtable of properties with two special workarounds
        # The hashtable will not include any properties marked as "NotConfigurable"
        # Any properties with a ValidateSet of "True","False" will beconverted to Boolean type
        # The intent is to simplify splatting to functions
        # Source: https://gist.github.com/mgreenegit/e3a9b4e136fc2d510cf87e20390daa44
        $DscProperties = @{}
        foreach ($property in [ScomAlertResolutionSetting].GetProperties().Name)
        {
            # Checks if "NotConfigurable" attribute is set
            $notConfigurable = [ScomAlertResolutionSetting].GetProperty($property).GetCustomAttributes($false).Where({ $_ -is [System.Management.Automation.DscPropertyAttribute] }).NotConfigurable
            if (!$notConfigurable)
            {
                $value = $this.$property
                # Gets the list of valid values from the ValidateSet attribute
                $validateSet = [ScomAlertResolutionSetting].GetProperty($property).GetCustomAttributes($false).Where({ $_ -is [System.Management.Automation.ValidateSetAttribute] }).ValidValues
                if ($validateSet)
                {
                    # Workaround for boolean types
                    if ($null -eq (Compare-Object @('True', 'False') $validateSet))
                    {
                        $value = [System.Convert]::ToBoolean($this.$property)
                    }
                }
                # Add property to new
                $DscProperties.add($property, $value)
            } 
        }
        return $DscProperties
    }
}