Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added support for CimInstances #9

Merged
merged 10 commits into from
Apr 14, 2022
2 changes: 0 additions & 2 deletions DscBuildHelpers/DscBuildHelpers.psd1
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,5 @@
@{ ModuleName = 'xDscResourceDesigner'; ModuleVersion = '1.9.0.0'} #tested with 1.9.0.0
)

ScriptsToProcess = @('.\ScriptsToProcess\Get-DscSplattedResource.ps1')

FunctionsToExport = '*'
}
26 changes: 26 additions & 0 deletions DscBuildHelpers/Public/Get-DscCimInstanceReference.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
function Get-DscCimInstanceReference {
param(
[Parameter(Mandatory = $true)]
[string]
$ResourceName,

[Parameter(Mandatory = $true)]
[string]
$ParameterName,

[Parameter()]
[object]
$Data
)

if ($Script:allDscResourcePropertiesTable) {
if ($allDscResourcePropertiesTable.ContainsKey("$($ResourceName)-$($ParameterName)")) {
$p = $allDscResourcePropertiesTable."$($ResourceName)-$($ParameterName)"
$typeConstraint = $p.TypeConstraint -replace '\[\]', ''
Get-DscSplattedResource -ResourceName $typeConstraint -Properties $Data -NoInvoke
}
}
else {
Write-Host "No DSC Resource Properties metadata was found, cannot translate CimInstance parameters. Call 'Initialize-DscResourceMetaInfo' first is this is needed."
}
}
35 changes: 35 additions & 0 deletions DscBuildHelpers/Public/Get-DscResourceProperty.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
function Get-DscResourceProperty {
[CmdletBinding()]
param (
[Parameter(Mandatory)]
[System.Management.Automation.PSModuleInfo]
$ModuleInfo,

[Parameter(Mandatory)]
[string]
$ResourceName
)

[Microsoft.PowerShell.DesiredStateConfiguration.Internal.DscClassCache]::ClearCache()
$functionsToDefine = New-Object -TypeName 'System.Collections.Generic.Dictionary[string,ScriptBlock]'([System.StringComparer]::OrdinalIgnoreCase)
[Microsoft.PowerShell.DesiredStateConfiguration.Internal.DscClassCache]::LoadDefaultCimKeywords($functionsToDefine)

$schemaFilePath = $null
$keywordErrors = New-Object -TypeName 'System.Collections.ObjectModel.Collection[System.Exception]'
$foundCimSchema = [Microsoft.PowerShell.DesiredStateConfiguration.Internal.DscClassCache]::ImportCimKeywordsFromModule($ModuleInfo, $ResourceName, [ref] $SchemaFilePath, $functionsToDefine, $keywordErrors)
$foundScriptSchema = [Microsoft.PowerShell.DesiredStateConfiguration.Internal.DscClassCache]::ImportScriptKeywordsFromModule($ModuleInfo, $ResourceName, [ref] $SchemaFilePath, $functionsToDefine)
$resourceProperties = ([System.Management.Automation.Language.DynamicKeyword]::GetKeyword($ResourceName)).Properties

foreach ($key in $resourceProperties.Keys) {
[PSCustomObject]@{
Name = $resourceProperties.$key.Name
TypeConstraint = $resourceProperties.$key.TypeConstraint
Attributes = $resourceProperties.$key.Attributes
Values = $resourceProperties.$key.Values
ValueMap = $resourceProperties.$key.ValueMap
Mandatory = $resourceProperties.$key.Mandatory
IsKey = $resourceProperties.$key.IsKey
Range = $resourceProperties.$key.Range
}
}
}
97 changes: 82 additions & 15 deletions DscBuildHelpers/Public/Get-DscSplattedResource.ps1
Original file line number Diff line number Diff line change
@@ -1,44 +1,111 @@
function Global:Get-DscSplattedResource {
function Get-DscSplattedResource
{
[CmdletBinding()]
Param(
[Parameter(Mandatory = $true)]
[String]
$ResourceName,

[Parameter()]
[String]
$ExecutionName,

[Parameter()]
[hashtable]
$Properties,

[Parameter()]
[switch]
$NoInvoke
)

if (-not $script:allDscResourcePropertiesTable -and -not $script:allDscResourcePropertiesTableWarningShown) {
Write-Warning -Message "The 'allDscResourcePropertiesTable' is not defined. This will be an expensive operation. Resources with MOF sub-types are only supported when calling 'Initialize-DscResourceMetaInfo' once before starting the compilation process."
$script:allDscResourcePropertiesTableWarningShown = $true
}

# Remove Case Sensitivity of ordered Dictionary or Hashtables
$Properties = @{}+$Properties
$Properties = @{} + $Properties

$stringBuilder = [System.Text.StringBuilder]::new()
$null = $stringBuilder.AppendLine("Param([hashtable]`$Parameters)")
$null = $stringBuilder.AppendLine()
$null = $stringBuilder.AppendLine(' if ($Parameters) {')
$null = $stringBuilder.AppendLine(' $($Parameters=@{}+$Parameters)')
$null = $stringBuilder.AppendLine(' }')
$null = $stringBuilder.AppendLine(" $ResourceName $ExecutionName { ")
foreach($PropertyName in $Properties.keys) {
$null = $stringBuilder.AppendLine("$PropertyName = `$(`$Parameters['$PropertyName'])")

if ($ExecutionName)
{
$null = $stringBuilder.AppendLine("$ResourceName '$ExecutionName' {")
}
else
{
$null = $stringBuilder.AppendLine("$ResourceName {")
}

foreach ($PropertyName in $Properties.Keys) {

$cimType = $allDscResourcePropertiesTable."$ResourceName-$PropertyName"
if ($cimType)
{
$isCimArray = $cimType.TypeConstraint.EndsWith("[]")
$cimProperties = $Properties.$PropertyName
$null = $stringBuilder.AppendLine("$PropertyName = {0}" -f $(if ($isCimArray) { '@(' } else { "$($cimType.TypeConstraint.Replace('[]', '')) {" }))
if ($isCimArray)
{
if ($Properties.$PropertyName -isnot [array])
{
Write-Warning -Message "The property '$PropertyName' is an array and the BindingInfo data is not an array" -ErrorAction Stop
}

$i = 0
foreach ($cimPropertyValue in $cimProperties)
{
$null = $stringBuilder.AppendLine($cimType.TypeConstraint.Replace('[]', ''))
$null = $stringBuilder.AppendLine("{")

foreach ($cimSubProperty in $cimPropertyValue.GetEnumerator())
{
$null = $stringBuilder.AppendLine("$($cimSubProperty.Name) = `$(`$Parameters['$PropertyName'][$($i)]['$($cimSubProperty.Name)'])")

}

$null = $stringBuilder.AppendLine("}")
$i++
}

$null = $stringBuilder.AppendLine('{0}' -f $(if ($isCimArray) { ')' }))
}
else
{
foreach ($cimProperty in $cimProperties.GetEnumerator())
{
$null = $stringBuilder.AppendLine("$($cimProperty.Name) = `$(`$Parameters['$PropertyName']['$($cimProperty.Name)'])")
}

$null = $stringBuilder.AppendLine("}")
}
}
else
{
$null = $stringBuilder.AppendLine("$PropertyName = `$(`$Parameters['$PropertyName'])")
}
}

$null = $stringBuilder.AppendLine("}")
Write-Debug ("Generated Resource Block = {0}" -f $stringBuilder.ToString())
Write-Debug -Message ('Generated Resource Block = {0}' -f $stringBuilder.ToString())

if($NoInvoke.IsPresent) {
if ($NoInvoke)
{
[scriptblock]::Create($stringBuilder.ToString())
}
else {
if ($Properties) {
else
{
if ($Properties)
{
[scriptblock]::Create($stringBuilder.ToString()).Invoke($Properties)
} else {
} else
{
[scriptblock]::Create($stringBuilder.ToString()).Invoke()
}
}
}
Set-Alias -Name x -Value Get-DscSplattedResource -scope Global
#Export-ModuleMember -Alias x

Set-Alias -Name x -Value Get-DscSplattedResource -Scope Global
56 changes: 56 additions & 0 deletions DscBuildHelpers/Public/Initialize-DscResourceMetaInfo.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
function Initialize-DscResourceMetaInfo
{
param (
[Parameter(Mandatory)]
[string]
$ModulePath,

[Parameter()]
[switch]
$ReturnAllProperties,

[Parameter()]
[switch]
$Force
)

if ($script:allDscResourcePropertiesTable -and -not $Force)
{
return
}

$allModules = Get-ModuleFromFolder -ModuleFolder $ModulePath
$allDscResource = Get-DscResourceFromModuleInFolder -ModuleFolder $ModulePath -Modules $allModules
$modulesWithDscResources = $allDscResource | Select-Object -ExpandProperty ModuleName -Unique
$modulesWithDscResources = $allModules | Where-Object Name -In $modulesWithDscResources

$script:allDscResourcePropertiesTable = @{}

$script:allDscResourceProperties = foreach ($dscResource in $allDscResource)
{
$cimProperties = if ($ReturnAllProperties)
{
Get-DscResourceProperty -ModuleInfo ($modulesWithDscResources | Where-Object Name -EQ $dscResource.ModuleName) -ResourceName $dscResource.Name
}
else
{
Get-DscResourceProperty -ModuleInfo ($modulesWithDscResources | Where-Object Name -EQ $dscResource.ModuleName) -ResourceName $dscResource.Name | Where-Object { $_.TypeConstraint -like 'MSFT_*' -and $_.TypeConstraint -ne 'MSFT_Credential' }
}

foreach ($cimProperty in $cimProperties)
{
[PSCustomObject]@{
Name = $cimProperty.Name
TypeConstraint = $cimProperty.TypeConstraint
IsKey = $cimProperty.IsKey
Mandatory = $cimProperty.Mandatory
Values = $cimProperty.Values
Range = $cimProperty.Range
ModuleName = $dscResource.ModuleName
ResourceName = $dscResource.Name
}
$script:allDscResourcePropertiesTable."$($dscResource.Name)-$($cimProperty.Name)" = $cimProperty
}

}
}
44 changes: 0 additions & 44 deletions DscBuildHelpers/ScriptsToProcess/Get-DscSplattedResource.ps1

This file was deleted.