win_scheduled_task: add deprecation warning for repetition format (#45468)

* win_scheduled_task: add deprecation warning for repetition format

* fixed up sanity issues
This commit is contained in:
Jordan Borean 2018-09-11 14:22:57 +10:00 committed by GitHub
commit ec6d82435f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 95 additions and 44 deletions

View file

@ -10,7 +10,49 @@
$ErrorActionPreference = "Stop"
Function ConvertTo-Hashtable {
param([Object]$Value)
if ($null -eq $Value) {
return $null
}
$value_type = $Value.GetType()
if ($value_type.IsGenericType) {
$value_type = $value_type.GetGenericTypeDefinition()
}
if ($value_type -eq [System.Collections.Generic.Dictionary`2]) {
$new_value = @{}
foreach ($kv in $Value.GetEnumerator()) {
$new_value.Add($kv.Key, (ConvertTo-Hashtable -Value $kv.Value))
}
return ,$new_value
} elseif ($value_type -eq [System.Collections.ArrayList]) {
for ($i = 0; $i -lt $Value.Count; $i++) {
$Value[$i] = ConvertTo-Hashtable -Value $Value[$i]
}
return ,$Value.ToArray()
} else {
return ,$Value
}
}
$params = Parse-Args -arguments $args -supports_check_mode $true
# FUTURE: remove this once exec_wrapper has this behaviour inbuilt with the new
# json changes in the exec_wrapper.
# Currently ConvertFrom-Json creates a PSObject for the deserialized JSON and the
# exec_wrapper converts all dicts as Hashtable. Unfortunately it doesn't
# convert any dict in lists leaving to some confusing behaviour. We manually
# use JavaScriptSerializer to ensure we have the type of objects to simply the
# code in the module when it comes to type checking
$params_json = ConvertTo-Json -InputObject $params -Depth 99 -Compress
Add-Type -AssemblyName System.Web.Extensions
$json = New-Object -TypeName System.Web.Script.Serialization.JavaScriptSerializer
$json.MaxJsonLength = [Int32]::MaxValue
$json.RecursionLimit = [Int32]::MaxValue
$params = ConvertTo-Hashtable -Value ($json.Deserialize($params_json, [System.Collections.Generic.Dictionary`2[[String], [Object]]]))
$check_mode = Get-AnsibleParam -obj $params -name "_ansible_check_mode" -type "bool" -default $false
$diff_mode = Get-AnsibleParam -obj $params -name "_ansible_diff" -type "bool" -default $false
$_remote_tmp = Get-AnsibleParam $params "_ansible_remote_tmp" -type "path" -default $env:TMP
@ -132,23 +174,6 @@ $env:TMP = $original_tmp
########################
### HELPER FUNCTIONS ###
########################
Function ConvertTo-HashtableFromPsCustomObject($object) {
if ($object -is [Hashtable]) {
return ,$object
}
$hashtable = @{}
$object | Get-Member -MemberType *Property | % {
$value = $object.$($_.Name)
if ($value -is [PSObject]) {
$value = ConvertTo-HashtableFromPsCustomObject -object $value
}
$hashtable.$($_.Name) = $value
}
return ,$hashtable
}
Function Convert-SnakeToPascalCase($snake) {
# very basic function to convert snake_case to PascalCase for use in COM
# objects
@ -275,9 +300,9 @@ Function Compare-PropertyList {
$property_value = $new_property.$property_arg
if ($property_value -is [Hashtable]) {
foreach ($sub_property_arg in $property_value.Keys) {
$sub_com_name = Convert-SnakeToPascalCase -snake $sub_property_arg
$sub_property_value = $property_value.$sub_property_arg
foreach ($kv in $property_value.GetEnumerator()) {
$sub_com_name = Convert-SnakeToPascalCase -snake $kv.Key
$sub_property_value = $kv.Value
[void]$diff_list.Add("+$com_name.$sub_com_name=$sub_property_value")
}
} else {
@ -299,9 +324,9 @@ Function Compare-PropertyList {
$property_value = $new_property.$property_arg
if ($property_value -is [Hashtable]) {
foreach ($sub_property_arg in $property_value.Keys) {
$sub_com_name = Convert-SnakeToPascalCase -snake $sub_property_arg
$sub_property_value = $property_value.$sub_property_arg
foreach ($kv in $property_value.GetEnumerator()) {
$sub_com_name = Convert-SnakeToPascalCase -snake $kv.Key
$sub_property_value = $kv.Value
[void]$diff_list.Add("+$com_name.$sub_com_name=$sub_property_value")
}
} else {
@ -320,9 +345,9 @@ Function Compare-PropertyList {
$existing_value = $existing_property.$com_name
if ($property_value -is [Hashtable]) {
foreach ($sub_property_arg in $property_value.Keys) {
$sub_property_value = $property_value.$sub_property_arg
$sub_com_name = Convert-SnakeToPascalCase -snake $sub_property_arg
foreach ($kv in $property_value.GetEnumerator()) {
$sub_property_value = $kv.Value
$sub_com_name = Convert-SnakeToPascalCase -snake $kv.Key
$sub_existing_value = $existing_property.$com_name.$sub_com_name
if ($sub_property_value -ne $null) {
@ -356,11 +381,11 @@ Function Compare-PropertyList {
$existing_value = $existing_property.$com_name
if ($property_value -is [Hashtable]) {
foreach ($sub_property_arg in $property_value.Keys) {
$sub_property_value = $property_value.$sub_property_arg
foreach ($kv in $property_value.GetEnumerator()) {
$sub_property_value = $kv.Value
if ($sub_property_value -ne $null) {
$sub_com_name = Convert-SnakeToPascalCase -snake $sub_property_arg
$sub_com_name = Convert-SnakeToPascalCase -snake $kv.Key
$sub_existing_value = $existing_property.$com_name.$sub_com_name
if ($sub_property_value -cne $sub_existing_value) {
@ -388,10 +413,10 @@ Function Compare-PropertyList {
$com_name = Convert-SnakeToPascalCase -snake $property_arg
$new_object_property = $new_object.$com_name
foreach ($key in $new_value.Keys) {
$value = $new_value.$key
foreach ($kv in $new_value.GetEnumerator()) {
$value = $kv.Value
if ($value -ne $null) {
Set-PropertyForComObject -com_object $new_object_property -name $property_name -arg $key -value $value
Set-PropertyForComObject -com_object $new_object_property -name $property_name -arg $kv.Key -value $value
}
}
} elseif ($new_value -ne $null) {
@ -731,7 +756,7 @@ if ($run_level -ne $null) {
# manually add the only support action type for each action - also convert PSCustomObject to Hashtable
for ($i = 0; $i -lt $actions.Count; $i++) {
$action = ConvertTo-HashtableFromPsCustomObject -object $actions[$i]
$action = $actions[$i]
$action.type = [TASK_ACTION_TYPE]::TASK_ACTION_EXEC
if (-not $action.ContainsKey("path")) {
Fail-Json -obj $result -message "action entry must contain the key 'path'"
@ -741,7 +766,7 @@ for ($i = 0; $i -lt $actions.Count; $i++) {
# convert and validate the triggers - and convert PSCustomObject to Hashtable
for ($i = 0; $i -lt $triggers.Count; $i++) {
$trigger = ConvertTo-HashtableFromPsCustomObject -object $triggers[$i]
$trigger = $triggers[$i]
$valid_trigger_types = @('event', 'time', 'daily', 'weekly', 'monthly', 'monthlydow', 'idle', 'registration', 'boot', 'logon', 'session_state_change')
if (-not $trigger.ContainsKey("type")) {
Fail-Json -obj $result -message "a trigger entry must contain a key 'type' with a value of '$($valid_trigger_types -join "', '")'"
@ -781,7 +806,10 @@ for ($i = 0; $i -lt $triggers.Count; $i++) {
}
if ($trigger.ContainsKey("repetition")) {
$trigger.repetition = ConvertTo-HashtableFromPsCustomObject -object $trigger.repetition
if ($trigger.repetition -is [Array]) {
Add-DeprecationWarning -obj $result -message "repetition is a list, should be defined as a dict" -version "2.12"
$trigger.repetition = $trigger.repetition[0]
}
$interval_timespan = $null
if ($trigger.repetition.ContainsKey("interval") -and $trigger.repetition.interval -ne $null) {

View file

@ -468,7 +468,7 @@ EXAMPLES = r'''
triggers:
- type: registration
repetition:
- interval: PT1M
interval: PT1M
duration: PT5M
stop_at_duration_end: yes
'''

View file

@ -252,7 +252,10 @@ try {
$result.folder_exists = $true
} catch {
$result.folder_exists = $false
$task_folder = $null
if ($null -ne $name) {
$result.task_exists = $false
}
Exit-Json -obj $result
}
$folder_tasks = $task_folder.GetTasks(1)