Update module version to 1.0.1 and add new functions for exporting and deploying DSC configuration data
This commit is contained in:
143
Public/New-DSCConfigurationDataDeployment.ps1
Normal file
143
Public/New-DSCConfigurationDataDeployment.ps1
Normal file
@@ -0,0 +1,143 @@
|
||||
function New-DSCConfigurationDataDeployment {
|
||||
[CmdletBinding(SupportsShouldProcess=$true)]
|
||||
Param(
|
||||
[Parameter(Mandatory=$false)]
|
||||
[string]
|
||||
$Path,
|
||||
|
||||
[Parameter(Mandatory=$true)]
|
||||
[string]
|
||||
$Name,
|
||||
|
||||
[Parameter(Mandatory=$true)]
|
||||
[string]
|
||||
$DeploymentId,
|
||||
|
||||
[Parameter(Mandatory=$true)]
|
||||
[Alias("SourceTemplates")]
|
||||
[string[]]
|
||||
$SourceTemplatePath,
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[hashtable[]]
|
||||
$AllNodes = @(),
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[System.Collections.IDictionary]
|
||||
$DeploymentData = @{},
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[switch]
|
||||
$UseRelativePaths,
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[switch]
|
||||
$Export,
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[ValidateSet("PowerShellDataFile", "Json")]
|
||||
[string]
|
||||
$Format = "PowerShellDataFile",
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[switch]
|
||||
$Force,
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[switch]
|
||||
$PassThru
|
||||
)
|
||||
|
||||
if($Export -and [string]::IsNullOrWhiteSpace($Path)){
|
||||
throw "Parameter [Path] is required when [Export] is used."
|
||||
}
|
||||
|
||||
$ResolvedOutputPath = $null
|
||||
if(-not [string]::IsNullOrWhiteSpace($Path)){
|
||||
$ResolvedOutputPath = Repair-ConfigurationDataPathEncoding -Path $Path
|
||||
}
|
||||
|
||||
$OutputDirectory = if([string]::IsNullOrWhiteSpace($ResolvedOutputPath)){
|
||||
(Get-Location).Path
|
||||
}else{
|
||||
Split-Path -Path $ResolvedOutputPath -Parent
|
||||
}
|
||||
|
||||
if([string]::IsNullOrWhiteSpace($OutputDirectory)){
|
||||
$OutputDirectory = (Get-Location).Path
|
||||
}
|
||||
|
||||
$MergeResult = Merge-DSCConfigurationData -Path $SourceTemplatePath -PassThru
|
||||
$MergedTemplateData = $MergeResult.ConfigurationData
|
||||
|
||||
$DeploymentOverride = Copy-ConfigurationDataValue -Value $DeploymentData
|
||||
if($AllNodes.Count -gt 0){
|
||||
if(-not (Test-ConfigurationDataDictionaryKey -Dictionary $DeploymentOverride -Key "Resources")){
|
||||
$DeploymentOverride["Resources"] = @{}
|
||||
}
|
||||
|
||||
$DeploymentOverride["Resources"]["AllNodes"] = $AllNodes
|
||||
}
|
||||
|
||||
$ConfigurationData = Merge-DSCConfigurationData -Template $MergedTemplateData -Deployment $DeploymentOverride
|
||||
|
||||
$TemplatePaths = @($SourceTemplatePath | ForEach-Object {
|
||||
$Resolved = Resolve-ConfigurationDataTemplatePath -Path $_
|
||||
if($UseRelativePaths){
|
||||
ConvertTo-ConfigurationDataRelativePath -Path $Resolved -BasePath $OutputDirectory
|
||||
}else{
|
||||
$Resolved
|
||||
}
|
||||
})
|
||||
|
||||
$SourceFiles = @($MergeResult.Files | ForEach-Object {
|
||||
if($UseRelativePaths){
|
||||
ConvertTo-ConfigurationDataRelativePath -Path $_ -BasePath $OutputDirectory
|
||||
}else{
|
||||
$_
|
||||
}
|
||||
})
|
||||
|
||||
$ConfigurationData["Metadata"] = [ordered]@{
|
||||
TemplateType = "Deployment"
|
||||
Name = $Name
|
||||
DeploymentId = $DeploymentId
|
||||
GeneratedOn = (Get-Date).ToString("s")
|
||||
Sources = [ordered]@{
|
||||
Templates = $TemplatePaths
|
||||
Files = $SourceFiles
|
||||
}
|
||||
}
|
||||
|
||||
if(-not $Export){
|
||||
return $ConfigurationData
|
||||
}
|
||||
|
||||
if($PSCmdlet.ShouldProcess($ResolvedOutputPath, "Export DSC configuration data deployment as [$Format]")){
|
||||
switch($Format){
|
||||
"PowerShellDataFile" {
|
||||
Export-PowerShellDataFile -InputObject $ConfigurationData -Path $ResolvedOutputPath -Force:$Force
|
||||
}
|
||||
"Json" {
|
||||
if((Test-Path -LiteralPath $ResolvedOutputPath -PathType Leaf) -and (-not $Force)){
|
||||
throw "File [$ResolvedOutputPath] already exists. Use -Force to overwrite it."
|
||||
}
|
||||
|
||||
$Parent = Split-Path -Path $ResolvedOutputPath -Parent
|
||||
if(-not [string]::IsNullOrWhiteSpace($Parent) -and -not (Test-Path -LiteralPath $Parent)){
|
||||
New-Item -Path $Parent -ItemType Directory -Force | Out-Null
|
||||
}
|
||||
|
||||
$ConfigurationData | ConvertTo-Json -Depth 100 | Set-Content -LiteralPath $ResolvedOutputPath -Encoding UTF8
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($PassThru){
|
||||
return [PSCustomObject]@{
|
||||
Path = $ResolvedOutputPath
|
||||
Files = $MergeResult.Files
|
||||
ConfigurationData = $ConfigurationData
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user