Skip to content

Commit 1941c0a

Browse files
committed
Moved Test-DscParameterState to module CommonresourceHelper
1 parent 3f4094a commit 1941c0a

1 file changed

Lines changed: 250 additions & 0 deletions

File tree

DSCResources/CommonResourceHelper.psm1

Lines changed: 250 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,256 @@ function Get-LocalizedData
3838
return $localizedData
3939
}
4040

41+
function Remove-CommonParameter
42+
{
43+
[OutputType([hashtable])]
44+
[cmdletbinding()]
45+
param
46+
(
47+
[Parameter(Mandatory)]
48+
[hashtable]
49+
$Hashtable
50+
)
51+
52+
$inputClone = $Hashtable.Clone()
53+
$commonParameters = [System.Management.Automation.PSCmdlet]::CommonParameters
54+
$commonParameters += [System.Management.Automation.PSCmdlet]::OptionalCommonParameters
55+
56+
$Hashtable.Keys | Where-Object { $_ -in $commonParameters } | ForEach-Object {
57+
$inputClone.Remove($_)
58+
}
59+
60+
$inputClone
61+
}
62+
63+
function Test-DscParameterState
64+
{
65+
[CmdletBinding()]
66+
param
67+
(
68+
[Parameter(Mandatory)]
69+
[hashtable]
70+
$CurrentValues,
71+
72+
[Parameter(Mandatory)]
73+
[object]
74+
$DesiredValues,
75+
76+
[string[]]
77+
$ValuesToCheck,
78+
79+
[switch]$TurnOffTypeChecking
80+
)
81+
82+
$returnValue = $true
83+
84+
$types = 'System.Management.Automation.PSBoundParametersDictionary', 'System.Collections.Hashtable', 'Microsoft.Management.Infrastructure.CimInstance'
85+
86+
if ($DesiredValues.GetType().FullName -notin $types)
87+
{
88+
throw ("Property 'DesiredValues' in Test-DscParameterState must be either a Hashtable or CimInstance. Type detected was $($DesiredValues.GetType().Name)")
89+
}
90+
91+
if ($DesiredValues.GetType().FullName -eq 'Microsoft.Management.Infrastructure.CimInstance' -and -not $ValuesToCheck)
92+
{
93+
throw ("If 'DesiredValues' is a CimInstance then property 'ValuesToCheck' must contain a value")
94+
}
95+
96+
$DesiredValuesClean = Remove-CommonParameter -Hashtable $DesiredValues
97+
98+
if (-not $ValuesToCheck)
99+
{
100+
$keyList = $DesiredValuesClean.Keys
101+
}
102+
else
103+
{
104+
$keyList = $ValuesToCheck
105+
}
106+
107+
foreach ($key in $keyList)
108+
{
109+
if ($null -ne $DesiredValuesClean.$key)
110+
{
111+
$desiredType = $DesiredValuesClean.$key.GetType()
112+
}
113+
else
114+
{
115+
$desiredType = [psobject]@{ Name = 'Unknown' }
116+
}
117+
118+
if ($null -ne $CurrentValues.$key)
119+
{
120+
$currentType = $CurrentValues.$key.GetType()
121+
}
122+
else
123+
{
124+
$currentType = [psobject]@{ Name = 'Unknown' }
125+
}
126+
127+
if ($currentType.Name -ne 'Unknown' -and $desiredType.Name -eq 'PSCredential')
128+
{
129+
# This is a credential object. Compare only the user name
130+
if ($currentType.Name -eq 'PSCredential' -and $CurrentValues.$key.UserName -eq $DesiredValuesClean.$key.UserName)
131+
{
132+
Write-Verbose -Message ('MATCH: PSCredential username match. Current state is {0} and desired state is {1}' -f $CurrentValues.$key.UserName, $DesiredValuesClean.$key.UserName)
133+
continue
134+
}
135+
else
136+
{
137+
Write-Verbose -Message ('NOTMATCH: PSCredential username mismatch. Current state is {0} and desired state is {1}' -f $CurrentValues.$key.UserName, $DesiredValuesClean.$key.UserName)
138+
$returnValue = $false
139+
}
140+
141+
# Assume the string is our username when the matching desired value is actually a credential
142+
if($currentType.Name -eq 'string' -and $CurrentValues.$key -eq $DesiredValuesClean.$key.UserName)
143+
{
144+
Write-Verbose -Message ('MATCH: PSCredential username match. Current state is {0} and desired state is {1}' -f $CurrentValues.$key, $DesiredValuesClean.$key.UserName)
145+
continue
146+
}
147+
else
148+
{
149+
Write-Verbose -Message ('NOTMATCH: PSCredential username mismatch. Current state is {0} and desired state is {1}' -f $CurrentValues.$key, $DesiredValuesClean.$key.UserName)
150+
$returnValue = $false
151+
}
152+
}
153+
154+
if (-not $TurnOffTypeChecking)
155+
{
156+
if (($desiredType.Name -ne 'Unknown' -and $currentType.Name -ne 'Unknown') -and
157+
$desiredType.FullName -ne $currentType.FullName)
158+
{
159+
Write-Verbose -Message "NOTMATCH: Type mismatch for property '$key' Current state type is '$($currentType.Name)' and desired type is '$($desiredType.Name)'"
160+
continue
161+
}
162+
}
163+
164+
if ($CurrentValues.$key -eq $DesiredValuesClean.$key -and -not $desiredType.IsArray)
165+
{
166+
Write-Verbose -Message "MATCH: Value (type $($desiredType.Name)) for property '$key' does match. Current state is '$($CurrentValues.$key)' and desired state is '$($DesiredValuesClean.$key)'"
167+
continue
168+
}
169+
170+
if ($DesiredValuesClean.GetType().Name -in 'HashTable', 'PSBoundParametersDictionary')
171+
{
172+
$checkDesiredValue = $DesiredValuesClean.ContainsKey($key)
173+
}
174+
else
175+
{
176+
$checkDesiredValue = Test-DSCObjectHasProperty -Object $DesiredValuesClean -PropertyName $key
177+
}
178+
179+
if (-not $checkDesiredValue)
180+
{
181+
Write-Verbose -Message "MATCH: Value (type $($desiredType.Name)) for property '$key' does match. Current state is '$($CurrentValues.$key)' and desired state is '$($DesiredValuesClean.$key)'"
182+
continue
183+
}
184+
185+
if ($desiredType.IsArray)
186+
{
187+
Write-Verbose "Comparing values in property '$key'"
188+
if (-not $CurrentValues.ContainsKey($key) -or -not $CurrentValues.$key)
189+
{
190+
Write-Verbose -Message "NOTMATCH: Value (type $($desiredType.Name)) for property '$key' does not match. Current state is '$($CurrentValues.$key)' and desired state is '$($DesiredValuesClean.$key)'"
191+
$returnValue = $false
192+
continue
193+
}
194+
elseif ($CurrentValues.$key.Count -ne $DesiredValues.$key.Count)
195+
{
196+
Write-Verbose -Message "NOTMATCH: Value (type $($desiredType.Name)) for property '$key' does have a different count. Current state count is '$($CurrentValues.$key.Count)' and desired state count is '$($DesiredValuesClean.$key.Count)'"
197+
$returnValue = $false
198+
continue
199+
}
200+
else
201+
{
202+
$desiredArrayValues = $DesiredValues.$key
203+
$currentArrayValues = $CurrentValues.$key
204+
205+
for ($i = 0; $i -lt $desiredArrayValues.Count; $i++)
206+
{
207+
if ($null -ne $desiredArrayValues[$i])
208+
{
209+
$desiredType = $desiredArrayValues[$i].GetType()
210+
}
211+
else
212+
{
213+
$desiredType = [psobject]@{ Name = 'Unknown' }
214+
}
215+
216+
if ($null -ne $currentArrayValues[$i])
217+
{
218+
$currentType = $currentArrayValues[$i].GetType()
219+
}
220+
else
221+
{
222+
$currentType = [psobject]@{ Name = 'Unknown' }
223+
}
224+
225+
if (-not $TurnOffTypeChecking)
226+
{
227+
if (($desiredType.Name -ne 'Unknown' -and $currentType.Name -ne 'Unknown') -and
228+
$desiredType.FullName -ne $currentType.FullName)
229+
{
230+
Write-Verbose -Message "`tNOTMATCH: Type mismatch for property '$key' Current state type of element [$i] is '$($currentType.Name)' and desired type is '$($desiredType.Name)'"
231+
$returnValue = $false
232+
continue
233+
}
234+
}
235+
236+
if ($desiredArrayValues[$i] -ne $currentArrayValues[$i])
237+
{
238+
Write-Verbose -Message "`tNOTMATCH: Value [$i] (type $($desiredType.Name)) for property '$key' does match. Current state is '$($currentArrayValues[$i])' and desired state is '$($desiredArrayValues[$i])'"
239+
$returnValue = $false
240+
continue
241+
}
242+
else
243+
{
244+
Write-Verbose -Message "`tMATCH: Value [$i] (type $($desiredType.Name)) for property '$key' does match. Current state is '$($currentArrayValues[$i])' and desired state is '$($desiredArrayValues[$i])'"
245+
continue
246+
}
247+
}
248+
249+
}
250+
}
251+
else {
252+
if ($DesiredValuesClean.$key -ne $CurrentValues.$key)
253+
{
254+
Write-Verbose -Message "NOTMATCH: Value (type $($desiredType.Name)) for property '$key' does not match. Current state is '$($CurrentValues.$key)' and desired state is '$($DesiredValuesClean.$key)'"
255+
$returnValue = $false
256+
}
257+
258+
}
259+
}
260+
261+
Write-Verbose "Result is '$returnValue'"
262+
return $returnValue
263+
}
264+
265+
function Test-DSCObjectHasProperty
266+
{
267+
[CmdletBinding()]
268+
[OutputType([bool])]
269+
param
270+
(
271+
[Parameter(Mandatory)]
272+
[object]
273+
$Object,
274+
275+
[Parameter(Mandatory)]
276+
[string]
277+
$PropertyName
278+
)
279+
280+
if ($Object.PSObject.Properties.Name -contains $PropertyName)
281+
{
282+
return [bool]$Object.$PropertyName
283+
}
284+
285+
return $false
286+
}
287+
41288
Export-ModuleMember -Function @(
42289
'Get-LocalizedData'
290+
'Remove-CommonParameter'
291+
'Test-DscParameterState'
292+
'Test-DSCObjectHasProperty'
43293
)

0 commit comments

Comments
 (0)