-
Notifications
You must be signed in to change notification settings - Fork 51
Expand file tree
/
Copy pathSet-Config.ps1
More file actions
142 lines (123 loc) · 7.92 KB
/
Set-Config.ps1
File metadata and controls
142 lines (123 loc) · 7.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
function Set-Config {
[CmdletBinding(SupportsShouldProcess = $true)]
param(
[Parameter(Mandatory = $true)]
[object] $configurationParameters,
[Parameter(Mandatory = $false)]
[PSCustomObject] $inputConfig = $null,
[Parameter(Mandatory = $false)]
[switch] $copyEnvVarToConfig
)
if ($PSCmdlet.ShouldProcess("Set Configuration.", "Set configuration values.")) {
$configurations = $configurationParameters.PsObject.Properties
foreach ($configurationValue in $configurations) {
# Check for calculated configuration
if($configurationValue.Value.Source -eq "calculated") {
$configurationValue.Value.Value = $configurationValue.Value.Pattern
continue
}
# Get input config name
$inputConfigName = $configurationValue.Name
if($configurationValue.Value.PSObject.Properties.Name -contains "SourceInput") {
$inputConfigName = $configurationValue.Value.SourceInput
Write-Verbose "Using source input $inputConfigName for $($configurationValue.Name)"
}
# Look for environment variables
$environmentVariable = [Environment]::GetEnvironmentVariable("TF_VAR_$inputConfigName")
if($null -ne $environmentVariable) {
if($copyEnvVarToConfig) {
$configurationValue.Value.Value = $environmentVariable
Write-Verbose "Set value from environment variable for $inputConfigName"
} else {
$configurationValue.Value.Value = "sourced-from-env"
Write-Verbose "Using environment variable for $inputConfigName"
}
continue
}
# Look for collection config match
if($inputConfigName.EndsWith("]")) {
Write-Verbose "Looking for collection input config match for $inputConfigName"
$indexSplit = $inputConfigName.Split([char[]]@('[', ']'), [System.StringSplitOptions]::RemoveEmptyEntries)
$inputConfigItem = $inputConfig.PsObject.Properties | Where-Object { $_.Name -eq $indexSplit[0] }
if($null -ne $inputConfigItem) {
Write-Verbose "Found collection input config match for $inputConfigName"
$inputConfigItemValue = $inputConfigItem.Value.Value
$inputConfigItemValueType = $inputConfigItemValue.GetType().FullName
Write-Verbose "Input config item value type: $inputConfigItemValueType"
$indexString = $indexSplit[1].Replace("`"", "").Replace("'", "")
Write-Verbose "Using index $indexString for input config item $inputConfigName"
if([int]::TryParse($indexString, [ref]$null)) {
# Handle integer index for arrays
Write-Verbose "Handling integer index for array"
if(!$inputConfigItemValueType.EndsWith("[]") -and !$inputConfigItemValueType.StartsWith("System.Collections.Generic.List")) {
Write-Error "Input config item $($inputConfigName) is not an array, but an index was specified."
throw "Input config item $($inputConfigName) is not an array, but an index was specified."
}
$index = [int]$indexString
if($inputConfigItemValue.Length -le $index) {
Write-Verbose "Input config item $($inputConfigName) does not have an index of $index."
if($index -eq 0) {
Write-Error "At least one value is required for input config item $($inputConfigName)."
throw "At least one value is required for input config item $($inputConfigName)."
}
} else {
$inputConfigItemIndexValue = $inputConfigItemValue[$index]
if($null -ne $inputConfigItemIndexValue) {
$configurationValue.Value.Value = $inputConfigItemIndexValue
continue
} else {
Write-Verbose "Input config item $($inputConfigName) with index $index is null."
if($index -eq 0) {
Write-Error "At least one value is required for input config item $($inputConfigName)."
throw "At least one value is required for input config item $($inputConfigName)."
}
}
}
} else {
# Handle string index for maps
Write-Verbose "Handling string index for map"
if(!$inputConfigItemValueType.EndsWith("PSCustomObject")) {
Write-Error "Input config item $($inputConfigName) is not a map, but a key was specified."
throw "Input config item $($inputConfigName) is not a map, but a key was specified."
}
$mapItem = $inputConfigItemValue.PsObject.Properties | Where-Object { $_.Name -eq $indexString }
if($null -ne $mapItem) {
$inputConfigItemIndexValue = $mapItem.Value
if($null -ne $inputConfigItemIndexValue) {
$configurationValue.Value.Value = $inputConfigItemIndexValue
continue
} else {
Write-Verbose "Input config item $($inputConfigName) with index $indexString is null."
Write-Error "At least one value is required for input config item $($inputConfigName)."
throw "At least one value is required for input config item $($inputConfigName)."
}
} else {
Write-Verbose "Input config item $($inputConfigName) does not have an index of $indexString."
Write-Error "At least one value is required for input config item $($inputConfigName)."
throw "At least one value is required for input config item $($inputConfigName)."
}
}
} else {
Write-Error "Input config item $($inputConfigName) not found."
throw "Input config item $($inputConfigName) not found."
}
}
# Look for input config match
$inputConfigItem = $inputConfig.PsObject.Properties | Where-Object { $_.Name -eq $inputConfigName }
if($null -ne $inputConfigItem) {
$configurationValue.Value.Value = $inputConfigItem.Value.Value
continue
}
# TODO: Add validation here...
# Use the default value if no input config is supplied
if($configurationValue.Value.PSObject.Properties.Name -match "DefaultValue") {
Write-Verbose "Input not supplied, so using default value of $($configurationValue.Value.DefaultValue) for $($configurationValue.Name)"
$configurationValue.Value.Value = $configurationValue.Value.DefaultValue
continue
}
Write-InformationColored "Input not supplied, and no default for $($configurationValue.Name)..." -ForegroundColor Red -InformationAction Continue
throw "Input not supplied, and no default for $($configurationValue.Name)..."
}
return $configurationParameters
}
}