Skip to content

Commit cc97a6a

Browse files
authored
Merge pull request #876 from Gijsreyn/fix-capabilities-discover-psadapter
Fix discovery of capabilities PSAdapter
2 parents 90b4e2a + b2713e4 commit cc97a6a

File tree

3 files changed

+38
-9
lines changed

3 files changed

+38
-9
lines changed

powershell-adapter/Tests/powershellgroup.resource.tests.ps1

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ Describe 'PowerShell adapter resource tests' {
2727
$r = dsc resource list '*' -a Microsoft.DSC/PowerShell
2828
$LASTEXITCODE | Should -Be 0
2929
$resources = $r | ConvertFrom-Json
30-
($resources | ? { $_.Type -eq 'TestClassResource/TestClassResource' }).Count | Should -Be 1
30+
($resources | Where-Object { $_.Type -eq 'TestClassResource/TestClassResource' }).Count | Should -Be 1
31+
($resources | Where-Object -Property type -EQ 'TestClassResource/TestClassResource').capabilities | Should -BeIn @('get', 'set', 'test', 'export')
32+
($resources | Where-Object -Property type -EQ 'TestClassResource/NoExport').capabilities | Should -BeIn @('get', 'set', 'test')
3133
}
3234

3335
It 'Get works on class-based resource' {

powershell-adapter/psDscAdapter/powershell.resource.ps1

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,13 @@ switch ($Operation) {
9191
# TODO: for perf, it is better to take capabilities from psd1 in Invoke-DscCacheRefresh, not by extra call to Get-Module
9292
if ($DscResourceInfo.ModuleName) {
9393
$module = Get-Module -Name $DscResourceInfo.ModuleName -ListAvailable | Sort-Object -Property Version -Descending | Select-Object -First 1
94-
if ($module.PrivateData.PSData.DscCapabilities) {
94+
# If the DscResourceInfo does have capabilities, use them or else use the module's capabilities
95+
if ($DscResourceInfo.Capabilities) {
96+
$capabilities = $DscResourceInfo.Capabilities
97+
} elseif ($module.PrivateData.PSData.DscCapabilities) {
98+
9599
$capabilities = $module.PrivateData.PSData.DscCapabilities
96-
}
97-
else {
100+
} else {
98101
$capabilities = @('get', 'set', 'test')
99102
}
100103
}

powershell-adapter/psDscAdapter/psDscAdapter.psm1

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Copyright (c) Microsoft Corporation.
22
# Licensed under the MIT License.
33

4-
$script:CurrentCacheSchemaVersion = 2
4+
$script:CurrentCacheSchemaVersion = 3
55

66
function Write-DscTrace {
77
param(
@@ -60,7 +60,7 @@ function Add-AstMembers {
6060

6161
foreach ($member in $TypeAst.Members) {
6262
$property = $member -as [System.Management.Automation.Language.PropertyMemberAst]
63-
if (($property -eq $null) -or ($property.IsStatic)) {
63+
if (($null -eq $property) -or ($property.IsStatic)) {
6464
continue;
6565
}
6666
$skipProperty = $true
@@ -117,7 +117,7 @@ function FindAndParseResourceDefinitions {
117117
$typeDefinitions = $ast.FindAll(
118118
{
119119
$typeAst = $args[0] -as [System.Management.Automation.Language.TypeDefinitionAst]
120-
return $typeAst -ne $null;
120+
return $null -ne $typeAst;
121121
},
122122
$false);
123123

@@ -139,6 +139,7 @@ function FindAndParseResourceDefinitions {
139139
$DscResourceInfo.Version = $moduleVersion
140140

141141
$DscResourceInfo.Properties = [System.Collections.Generic.List[DscResourcePropertyInfo]]::new()
142+
$DscResourceInfo.Capabilities = GetClassBasedCapabilities $typeDefinitionAst.Members
142143
Add-AstMembers $typeDefinitions $typeDefinitionAst $DscResourceInfo.Properties
143144

144145
$resourceList.Add($DscResourceInfo)
@@ -325,7 +326,7 @@ function Invoke-DscCacheRefresh {
325326

326327
# fill in resource files (and their last-write-times) that will be used for up-do-date checks
327328
$lastWriteTimes = @{}
328-
Get-ChildItem -Recurse -File -Path $dscResource.ParentPath -Include "*.ps1", "*.psd1", "*.psm1", "*.mof" -ea Ignore | % {
329+
Get-ChildItem -Recurse -File -Path $dscResource.ParentPath -Include "*.ps1", "*.psd1", "*.psm1", "*.mof" -ea Ignore | ForEach-Object {
329330
$lastWriteTimes.Add($_.FullName, $_.LastWriteTime)
330331
}
331332

@@ -338,7 +339,7 @@ function Invoke-DscCacheRefresh {
338339

339340
[dscResourceCache]$cache = [dscResourceCache]::new()
340341
$cache.ResourceCache = $dscResourceCacheEntries
341-
$m = $env:PSModulePath -split [IO.Path]::PathSeparator | % { Get-ChildItem -Directory -Path $_ -Depth 1 -ea SilentlyContinue }
342+
$m = $env:PSModulePath -split [IO.Path]::PathSeparator | ForEach-Object { Get-ChildItem -Directory -Path $_ -Depth 1 -ea SilentlyContinue }
342343
$cache.PSModulePaths = $m.FullName
343344
$cache.CacheSchemaVersion = $script:CurrentCacheSchemaVersion
344345

@@ -529,6 +530,28 @@ function GetTypeInstanceFromModule {
529530
return $instance
530531
}
531532

533+
function GetClassBasedCapabilities ($functionMemberAst) {
534+
$capabilities = [System.Collections.Generic.List[string[]]]::new()
535+
# These are the methods that we can potentially expect in a class-based DSC resource.
536+
$availableMethods = @('get', 'set', 'setHandlesExist', 'whatIf', 'test', 'delete', 'export')
537+
$methods = $functionMemberAst | Where-Object { $_ -is [System.Management.Automation.Language.FunctionMemberAst] -and $_.Name -in $availableMethods }
538+
539+
foreach ($method in $methods.Name) {
540+
# We go through each method to properly case handle the method names.
541+
switch ($method) {
542+
'Get' { $capabilities.Add('get') }
543+
'Set' { $capabilities.Add('set') }
544+
'Test' { $capabilities.Add('test') }
545+
'WhatIf' { $capabilities.Add('whatIf') }
546+
'SetHandlesExist' { $capabilities.Add('setHandlesExist') }
547+
'Delete' { $capabilities.Add('delete') }
548+
'Export' { $capabilities.Add('export') }
549+
}
550+
}
551+
552+
return ($capabilities | Select-Object -Unique)
553+
}
554+
532555
# cached resource
533556
class dscResourceCacheEntry {
534557
[string] $Type
@@ -578,4 +601,5 @@ class DscResourceInfo {
578601
[string] $ImplementedAs
579602
[string] $CompanyName
580603
[System.Collections.Generic.List[DscResourcePropertyInfo]] $Properties
604+
[string[]] $Capabilities
581605
}

0 commit comments

Comments
 (0)