resources/task.ps1
function Add-QlikTrigger { [CmdletBinding()] param ( [parameter(Mandatory = $true, ValueFromPipeline = $True, ValueFromPipelinebyPropertyName = $True, Position = 0)] [alias("id")] [string]$taskId, [string]$name, [parameter(ParameterSetName = "CompositeEvent")] [string[]]$OnSuccess, [parameter(ParameterSetName = "SchemaEvent")] [DateTime]$startDate, [parameter(ParameterSetName = "SchemaEvent")] [DateTime]$expirationDate, [parameter(ParameterSetName = "SchemaEvent")] [string]$timeZone, [parameter(ParameterSetName = "SchemaEvent")] [bool]$daylightSavingTime ) PROCESS { # $task = Get-QlikReloadTask -id $taskId -raw If ($startDate) { # $date = Get-Date -Format yyyy-MM-ddTHH:mm:ss.000Z $date if (!$name) { $name = 'Scheduled' } $update = @{ schemaEvents = @(@{ name = $name; enabled = $true; eventType = 0; startDate = $startDate.ToString("yyyy-MM-ddTHH:mm:ss.000Z"); expirationDate = if ($expirationDate) { $expirationDate.ToString("yyyy-MM-ddTHH:mm:ss.000Z") } else { "9999-12-30T23:59:59.999Z" }; schemaFilterDescription = @("* * - * * * * *"); incrementDescription = "0 0 1 0"; incrementOption = "2"; reloadTask = @{ id = $taskId } }) } } else { if (!$name) { $name = 'OnSuccess' } $update = @{ compositeEvents = @( @{ name = $name; enabled = $true; eventType = 1; reloadTask = @{ id = $taskId } timeConstraint = @{ seconds = 0; minutes = 360; hours = 0; days = 0; }; compositeRules = @($OnSuccess | ForEach-Object { @{ ruleState = 1; reloadTask = @{ id = $_ } } }); privileges = @("read", "update", "create", "delete") } ) } } if ($expirationDate) { $update.expirationDate = $expirationDate } if ($timeZone) { $update.timeZone = $timeZone } if ($daylightSavingTime) { $update.daylightSavingTime = $daylightSavingTime } $json = $update | ConvertTo-Json -Compress -Depth 10 return Invoke-QlikPost "/qrs/reloadtask/update" $json } } function Get-QlikReloadTask { [CmdletBinding()] param ( [parameter(Position = 0)] [string]$Id, [string]$Filter, [switch]$Full, [switch]$raw ) PROCESS { $path = "/qrs/reloadtask" If ( $id ) { $path += "/$id" } If ( $full ) { $path += "/full" } If ( $raw ) { $rawOutput = $true } return Invoke-QlikGet -path $path -filter $filter } } function Get-QlikTask { [CmdletBinding()] param ( [string]$filter, [switch]$full, [switch]$raw ) PROCESS { $path = "/qrs/task" If ( !$raw ) { If ( $id ) { $path += "/$id" } $path += "/full" $result = Invoke-QlikGet $path $filter If ( !$full ) { $result = $result | ForEach-Object { $props = @{ name = $_.name status = $_ | Select-Object -ExpandProperty operational | Select-Object -ExpandProperty lastExecutionResult | Select-Object -ExpandProperty status lastExecution = $_ | Select-Object -ExpandProperty operational | Select-Object -ExpandProperty lastExecutionResult | Select-Object -ExpandProperty startTime nextExecution = $_ | Select-Object -ExpandProperty operational | Select-Object -ExpandProperty nextExecution } New-Object -TypeName PSObject -Prop $props } } return $result } else { If ( $id ) { $path += "/$id" } If ( $full ) { $path += "/full" } If ( $raw ) { $rawOutput = $true } return Invoke-QlikGet $path $filter } } } function New-QlikTask { [CmdletBinding()] param ( [parameter(Mandatory = $true, ValueFromPipeline = $True, ValueFromPipelinebyPropertyName = $True, Position = 0)] [alias("id")] [string]$appId, [parameter(Mandatory = $true, Position = 1)] [string]$name, [string[]]$customProperties, [string[]]$tags ) PROCESS { $task = @{ task = @{ name = $name; taskType = 0; enabled = $true; taskSessionTimeout = 1440; maxRetries = 0; app = @{ id = $appId }; isManuallyTriggered = $false; }; } if ($PSBoundParameters.ContainsKey("customProperties")) { $task.task.customProperties = @(GetCustomProperties $customProperties) } if ($PSBoundParameters.ContainsKey("tags")) { $task.task.tags = @(GetTags $tags) } $json = $task | ConvertTo-Json -Compress -Depth 10 return Invoke-QlikPost '/qrs/reloadtask/create' $json } } function Remove-QlikTask { [CmdletBinding()] param ( [parameter(Position = 0, ValueFromPipelinebyPropertyName = $true)] [string]$id ) PROCESS { $taskType = "ReloadTask" $json = (@{ items = @( @{ type = $taskType; objectID = $id } ) } | ConvertTo-Json -Compress -Depth 10) $selection = Invoke-QlikPost "/qrs/selection" $json $result = Invoke-QlikDelete "/qrs/selection/$($selection.Id)/$taskType" Invoke-QlikDelete "/qrs/selection/$($selection.Id)" | Out-Null return $result } } function Start-QlikTask { [CmdletBinding()] param ( [parameter(Mandatory = $true, ValueFromPipeline = $True, ValueFromPipelinebyPropertyName = $True, Position = 0)] [string]$id, [switch]$wait ) PROCESS { $path = "/qrs/task" If ( $wait ) { $sync = "/synchronous" } If ( $id -match ($script:guid) ) { return Invoke-QlikPost "/qrs/task/$id/start$sync" } else { return Invoke-QlikPost "/qrs/task/start$($sync)?name=$id" } } } function Update-QlikReloadTask { [CmdletBinding()] param ( [parameter(Mandatory = $true, ValueFromPipeline = $True, ValueFromPipelinebyPropertyName = $True, Position = 0)] [string]$id, [Bool]$Enabled, [ValidateRange(1, 2147483647)] [Int]$TaskSessionTimeout, [ValidateRange(0, 20)] [Int]$MaxRetries, [string[]]$customProperties, [string[]]$tags ) PROCESS { $task = Get-QlikReloadTask -Id $id -raw If ( $psBoundParameters.ContainsKey("Enabled") ) { $task.enabled = $Enabled } If ( $psBoundParameters.ContainsKey("TaskSessionTimeout") ) { $task.taskSessionTimeout = $TaskSessionTimeout } If ( $psBoundParameters.ContainsKey("MaxRetries") ) { $task.maxRetries = $MaxRetries } if ($PSBoundParameters.ContainsKey("customProperties")) { $task.customProperties = @(GetCustomProperties $customProperties $task.customProperties) } if ($PSBoundParameters.ContainsKey("tags")) { $task.tags = @(GetTags $tags $task.tags) } $json = $task | ConvertTo-Json -Compress -Depth 10 return Invoke-QlikPut -path "/qrs/reloadtask/$id" -body $json } } function Wait-QlikExecution { [CmdletBinding()] param ( [parameter(Mandatory = $true, ValueFromPipeline = $True, ValueFromPipelinebyPropertyName = $True, Position = 0, ParameterSetName = "Execution")] [alias("value")] [string]$executionId, [parameter(Mandatory = $true, ValueFromPipelinebyPropertyName = $True, Position = 0, ParameterSetName = "Task")] [alias("id")] [string]$taskId ) PROCESS { if ($executionId) { $execution = Invoke-QlikGet "/qrs/executionSession/$executionId" $resultId = $execution.executionResult.Id $taskName = $execution.reloadTask.name } else { $task = Invoke-QlikGet "/qrs/reloadTask/$taskId" $resultId = $task.operational.lastExecutionResult.id $taskName = $task.name } do { # Get task status $rawOutput = $true $result = Invoke-QlikGet "/qrs/executionResult/$resultId" # Get internal task status code $taskstatuscode = $result.status $result = FormatOutput($result) Write-Progress -Activity $taskName -Status $result.status -CurrentOperation ($result.details | Select-Object -Last 1).message # Wait for 1 second, in a Production setting this should be set much higher to avoid stressing the QRS API Start-Sleep -Seconds 1 } until ($taskstatuscode -gt 3) #status code of more than 3 is a completion (both success and fail) return $result } } function New-QlikTaskSchedule { [CmdletBinding(DefaultParameterSetName = 'Default')] param ( [string]$Name, [Parameter(ParameterSetName = 'TaskID')] [Parameter(ParameterSetName = 'TaskName', Mandatory = $true)] [ValidateSet('Once', 'Minute', 'Hourly', 'Daily', 'Weekly', 'Monthly')] [string]$Repeat = 'Daily', [int]$RepeatEvery = 1, [datetime]$StartDate = $(Get-Date), [dateTime]$expirationDate = "9999-01-01T00:00:00.000", [ValidateSet('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')] [string[]]$DaysOfWeek = "Monday", [ValidateRange(1, 31)] [string[]]$DaysOfMonth, [ValidateSet('Pacific/Honolulu', 'America/Anchorage', 'America/Los_Angeles', 'America/Denver', 'America/Mazatlan', 'America/Phoenix', 'America/Belize', 'America/Chicago', 'America/Mexico_City', 'America/Regina', 'America/Bogota', 'America/Indianapolis', 'America/New_York', 'America/Caracas', 'America/Halifax', 'America/St_Johns', 'America/Buenos_Aires', 'America/Godthab', 'America/Santiago', 'America/Sao_Paulo', 'Atlantic/South_Georgia', 'Atlantic/Azores', 'Atlantic/Cape_Verde', 'UTC', 'Atlantic/Reykjavik', 'Africa/Casablanca', 'Europe/Dublin', 'Europe/Belgrade', 'Europe/Paris', 'Europe/Warsaw', 'Africa/Cairo', 'Africa/Harare', 'Asia/Jerusalem', 'Europe/Athens', 'Europe/Bucharest', 'Europe/Helsinki', 'Africa/Nairobi', 'Asia/Baghdad', 'Asia/Kuwait', 'Europe/Minsk', 'Europe/Moscow', 'Asia/Tehran', 'Asia/Baku', 'Asia/Muscat', 'Asia/Kabul', 'Asia/Karachi', 'Asia/Yekaterinburg', 'Asia/Calcutta', 'Asia/Colombo', 'Asia/Katmandu', 'Asia/Almaty', 'Asia/Dhaka', 'Asia/Rangoon', 'Asia/Bangkok', 'Asia/Krasnoyarsk', 'Asia/Hong_Kong', 'Asia/Irkutsk', 'Asia/Kuala_Lumpur', 'Asia/Taipei', 'Australia/Perth', 'Asia/Seoul', 'Asia/Tokyo', 'Asia/Yakutsk', 'Australia/Adelaide', 'Australia/Darwin', 'Asia/Vladivostok', 'Australia/Brisbane', 'Australia/Hobart', 'Australia/Sydney', 'Pacific/Guam', 'Pacific/Noumea', 'Pacific/Auckland', 'Pacific/Fiji', 'Pacific/Apia', 'Pacific/Tongatapu')] $TimeZone = 'UTC', [switch]$DaylightSavingTime, [Parameter(ParameterSetName = 'TaskID', Mandatory = $true)] [string]$ReloadTaskID, [Parameter(ParameterSetName = 'TaskName', Mandatory = $true)] [string]$ReloadTaskName ) [string]$StartDate = $startDate.ToString("yyyy-MM-ddTHH:mm:ss.000Z"); [string]$expirationDate = $expirationDate.ToString("yyyy-MM-ddTHH:mm:ss.000Z"); if ($PSBoundParameters.ContainsKey("DaysOfWeek")) { $WeekDays = ($DaysOfWeek | ForEach-Object { switch ($_) { Monday { 1 } Tuesday { 2 } Wednesday { 3 } Thursday { 4 } Friday { 5 } Saturday { 6 } Sunday { 0 } default { } } }) -join "," } if ($PSBoundParameters.ContainsKey("DaysOfMonth")) { $MonthDays = $DaysOfMonth -join "," } if ($DaylightSavingTime.IsPresent -eq $true) { $DST = 0 } else { $DST = 1 } Switch ($Repeat) { Once { $incrementDescription = "0 0 0 0" $schemaFilterDescription = "* * - * * * * *" } Minute { $incrementDescription = "$RepeatEvery 0 0 0" $schemaFilterDescription = "* * - * * * * *" } Hourly { $incrementDescription = "0 $RepeatEvery 0 0" $schemaFilterDescription = "* * - * * * * *" } Daily { $incrementDescription = "0 0 $RepeatEvery 0" $schemaFilterDescription = "* * - * * * * *" } Weekly { $incrementDescription = "0 0 1 0" $schemaFilterDescription = "* * - $WeekDays $RepeatEvery * * *" } Monthly { $incrementDescription = "0 0 1 0" $schemaFilterDescription = "* * - * * $MonthDays * *" } } if ($PSBoundParameters.ContainsKey("Name") -eq $false) { $name = "$repeat" } if ($PSCmdlet.ParameterSetName -eq "TaskID") { $filter = "id eq $ReloadTaskID" } if ($PSCmdlet.ParameterSetName -eq "TaskName") { $filter = "name eq '$ReloadTaskName'" } try { $reloadtask = Invoke-QlikGet "/qrs/task" -filter $filter if ($Null -eq $reloadtask) { throw } } catch { Write-Error -Message "Could not find Specified Reload Task" break } $TaskEvent = [pscustomobject] @{ name = "$($Name)" timezone = "$($timezone)" daylightSavingTime = $DST startDate = $StartDate expirationDate = $expirationDate schemaFilterDescription = @($schemaFilterDescription) incrementDescription = $incrementDescription incrementOption = 1 Integer = $null reloadTask = "" userSyncTask = "" externalProgramTask = "" } switch ($reloadtask.taskType) { 0 { $TaskEvent.reloadTask = $reloadtask } 1 { $TaskEvent.externalProgramTask = $reloadtask } } try { $json = $TaskEvent | ConvertTo-Json -Compress -Depth 10 -Verbose $QSevent = Invoke-QlikPost /qrs/schemaevent $json } catch { Write-Error -Message "Unable to create Reload Task event" break } return $QSevent } Function Remove-QlikTaskSchedule { param ( [Parameter(Mandatory = $true)] [guid]$ID ) Invoke-QlikDelete "/qrs/schemaevent/$ID" } Function Get-QlikTaskSchedule { [CmdletBinding(DefaultParameterSetName = 'Default')] param ( [string]$Name, [Parameter(ParameterSetName = 'TaskID', Mandatory = $true)] [string]$ReloadTaskID, [Parameter(ParameterSetName = 'TaskName', Mandatory = $true)] [string]$ReloadTaskName, [switch]$Full ) if ($PSCmdlet.ParameterSetName -eq "TaskID") { $filter = "id eq $ReloadTaskID" } if ($PSCmdlet.ParameterSetName -eq "TaskName") { $filter = "name eq '$ReloadTaskName'" } if ($PSCmdlet.ParameterSetName -ne "Default") { try { $reloadtasks = Invoke-QlikGet "/qrs/task" -filter $filter if ($Null -eq $reloadtasks) { throw } } catch { Write-Error -Message "Could not find Specified Reload Task" break } $schemaeventfilters = foreach ($reloadtask in $reloadtasks) { switch ($reloadtask.taskType) { 0 { "reloadTask.id eq $($reloadtask.id)" } 1 { "externalProgramTask.id eq $($reloadtask.id)" } } } $schemaeventfilter = $schemaeventfilters -join " or " } if ($Name.Length -gt 0) { if ($Name.Contains('*')) { [string[]]$NameParts = $Name.Split('*') | Where-Object { $_.Length -gt 0 } if ($NameParts.Count -gt 1) { if (!($Name.StartsWith('*'))) { $NameParts[0] = "name sw '$($NameParts[0])'" } else { $NameParts[0] = "name ew '$($NameParts[0])'" } if (!($Name.EndsWith('*'))) { $NameParts[-1] = "name ew '$($NameParts[-1])'" } else { $NameParts[-1] = "name so '$($NameParts[-1])'" } for ([int]$I = 1; $I -lt (($NameParts | Measure-Object).Count - 1); $I++) { $NameParts[$I] = "name so '$($NameParts[$I])'" } } else { if (!($Name.StartsWith('*'))) { $NameParts[0] = "name sw '$($NameParts[0])'" } else { $NameParts[0] = "name ew '$($NameParts[0])'" } } $NameFilter = $NameParts -join " and " } else { $NameFilter = "name eq '$Name'" } if ($schemaeventfilter.Length -gt 0) { $schemaeventfilter = "$schemaeventfilter and $NameFilter" } else { $schemaeventfilter = $NameFilter } } if ($full.IsPresent -eq $true) { $schemaeventpath = "/qrs/schemaevent/full" } else { $schemaeventpath = "/qrs/schemaevent" } Write-Verbose "$schemaeventpath" Write-Verbose "$schemaeventfilter" Invoke-QlikGet -path $schemaeventpath -filter $schemaeventfilter } |