Skip to content

Commit

Permalink
tolerate multiple versions of a DSC resource (#34)
Browse files Browse the repository at this point in the history
fix problem where Get-Module Name was returning multiple versions
change ConvertTo-ConfigDocument to bind to the latest encountered version of a DSC resource
resolve #33
  • Loading branch information
alx9r authored Jan 18, 2017
1 parent ccde9df commit 63c0fb5
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 24 deletions.
8 changes: 4 additions & 4 deletions Functions/classResourceInvokerType.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ $records = @{}
$stubResourceNames = @(
'StubResource1AFriendlyName','StubResource1BFriendlyName',
'StubResource2A','StubResource2B','StubResource2C',
'StubResource3A','StubResource3B'
'StubResource3A','StubResource3B','StubResource4A'
)
$stubClassResourceNames = @(
'StubResource2A','StubResource2B','StubResource2C',
'StubResource3A','StubResource3B'
'StubResource3A','StubResource3B','StubResource4A'
)
$stubMofResourceNames = @(
'StubResource1AFriendlyName','StubResource1BFriendlyName'
Expand Down Expand Up @@ -39,7 +39,7 @@ Describe New-ClassResourceObject {
{
$record = $records.$resourceName
It "returns correct resource object for $resourceName" {
$r = $record.DscResource | New-ClassResourceObject
$r = $record.DscResource | Select -First 1 | New-ClassResourceObject
$r.Count | Should be 1
$r.GetType().Name | Should be $resourceName
}
Expand All @@ -51,7 +51,7 @@ Describe Test-ClassResourceType {
{
$record = $records.$resourceName
It "$resourceName is a Class resource type" {
$r = $record.DscResource | Test-ClassResourceType
$r = $record.DscResource | Select -First 1 | Test-ClassResourceType
$r.Count | Should be 1
$r | Should beOfType bool
$r | Should be $true
Expand Down
10 changes: 9 additions & 1 deletion Functions/classResourceInvokerType.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,17 @@ function New-ClassResourceObject
)
{
$module | Import-Module

# $module isn't always a fully-populated object at this point
# We get the loaded modules(s) of the right name and select the
# one at the right path.
$liveModule = Get-Module $module.Name |
? { $_.ModuleBase -eq $module.ModuleBase } |
Select -First 1

try
{
$object = (Get-Module $module.Name).NewBoundScriptBlock(
$object = $liveModule.NewBoundScriptBlock(
[scriptblock]::Create("[$($DscResource.Name)]::new()")
).InvokeReturnAsIs()
}
Expand Down
38 changes: 24 additions & 14 deletions Functions/configDocumentType.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -232,27 +232,37 @@ Describe ConvertTo-ConfigDocument {
}
Context 'duplicate Resources' {
$h = @{}
It 'throws correct exception type' {
$h.CallSite = & {$MyInvocation}
It 'tolerates exact duplicates' {
$raw = New-RawConfigDocument 'DocumentName' {
Get-DscResource StubResource2A | Import-DscResource
Get-DscResource StubResource2A | Import-DscResource
StubResource2A ConfigName2A @{}
}
try
{
$raw | ConvertTo-ConfigDocument
}
catch [FormatException]
{
$h.Exception = $_
$r = $raw | ConvertTo-ConfigDocument
$r.Resources.Count | Should be 1
$r.Resources.Keys[0] | Should be '[StubResource2A]ConfigName2A'
}
It 'binds to the later version...' {
$raw = New-RawConfigDocument 'DocumentName' {
Get-DscResource StubResource4A | ? {$_.Version -eq '1.1'} | Import-DscResource
Get-DscResource StubResource4A | ? {$_.Version -eq '1.0'} | Import-DscResource
StubResource4A ConfigName4A @{}
}
$h.Exception | Should not beNullOrEmpty
$r = $raw | ConvertTo-ConfigDocument
$r.Resources.Count | Should be 1
$r.Resources.'[StubResource4A]ConfigName4A'.Resource.Version |
Should be '1.1'
}
It 'the exception shows the filename of the offending call' {}
It 'the exception shows the line number of the offending call' {}
It 'the exception contains an informative message' {
$h.Exception.ToString() | Should match 'Duplicate resource named StubResource2A'
It '...regardless of order encountered' {
$raw = New-RawConfigDocument 'DocumentName' {
Get-DscResource StubResource4A | ? {$_.Version -eq '1.0'} | Import-DscResource
Get-DscResource StubResource4A | ? {$_.Version -eq '1.1'} | Import-DscResource
StubResource4A ConfigName4A @{}
}
$r = $raw | ConvertTo-ConfigDocument
$r.Resources.Count | Should be 1
$r.Resources.'[StubResource4A]ConfigName4A'.Resource.Version |
Should be '1.1'
}
}
Context 'bad resource binding' {
Expand Down
12 changes: 7 additions & 5 deletions Functions/configDocumentType.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,14 @@ function ConvertTo-ConfigDocument
$resources = [System.Collections.Generic.Dictionary[System.String,Microsoft.PowerShell.DesiredStateConfiguration.DscResourceInfo]]::new()
foreach ( $resource in $InputObject.DscResources )
{
# check for duplicate resource names
if ( $resources.ContainsKey( $resource.Name ) )
# skip duplicate resources with lower version numbers
if
(
$resources.ContainsKey( $resource.Name ) -and
( $resource.Version -lt $resources.($resource.Name).Version )
)
{
throw [System.FormatException]::new(
"Duplicate resource named $($resource.Name)"
)
continue
}

$resources.($resource.Name) = $resource
Expand Down

0 comments on commit 63c0fb5

Please sign in to comment.