Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagepowershell
titleExample how to rollout scheduling objects
linenumberstrue
collapsetrue
# Example for rollout of scheduling objects from an archive file

# ----- begin: adjust to your environment -----
$Url = 'https://apmacwin:4243/'
$Credential = ( New-Object -typename System.Management.Automation.PSCredential -ArgumentList 'root', ( 'root' | ConvertTo-SecureString -AsPlainText -Force) )
$ControllerId = "jobscheduler"

$ArchiveFile = "/tmp/export.zip"
$TempDir = "$env:TEMP"

$debugPreference = 'continue'
$verbosePreference = 'continue'
# Start-Transcript -Path ./console.log
# ----- end: adjust to your environment -----


# load module and authenticate
Import-Module JS7
Connect-JS7 -Url $Url -Credential $Credential -Id $ControllerId

# prepare
$suspendedOrders = @()
$blockedOrders = @()
$objectTypesToFileExtensions = @{   'WORKFLOW'='.workflow.json'; 
                                    'JOBRESOURCE'='.jobresource.json'; 
                                    'LOCK'='.lock.json'; 
                                    'NOTICEBOARD'='noticeboard.json'; 
                                    'FILEORDERSOURCE'='fileordersource.json'; 
                                    'WORKINGDAYSCALENDAR'='.calendar.json'; 
                                    'NONWORKINGDAYSCALENDAR'='.calendar.json'; 
                                    'SCHEDULE'='.schedule.json'; 
                                    'JOBTEMPLATE'='.jobtemplate.json'; 
                                    'INCLUDESCRIPT'='.includescript.json'; 
                                    'REPORT'='.report.json'
}

# step 1: import archive file
Import-JS7InventoryItem -FilePath $ArchiveFile -TargetFolder / -Overwrite

#         get top-level folders from archive file
$archiveDir = New-Item -Path $TempDir -Name $(New-Guid) -ItemType Directory
Expand-Archive -Path $ArchiveFile -DestinationPath $archiveDir

$topLevelFolders = Get-ChildItem -Path $archiveDir -Directory

try
{
    # step 2: deploy/release scheduling objects
    #         release baseline objects
    foreach( $folder in $topLevelFolders )
    {
        Publish-JS7ReleasableItem -Folder "/$($folder.Name)" -Recursive -Type 'INCLUDESCRIPT','JOBTEMPLATE'
    }
    
    #         deployable items
    foreach( $folder in $topLevelFolders )
    {
        Publish-JS7DeployableItem -ControllerId $ControllerId -Folder "/$($folder.Name)" -Recursive
    }
    
    #         release complex scheduling objects
    foreach( $folder in $topLevelFolders )
    {
        Publish-JS7ReleasableItem -Folder "/$($folder.Name)" -Recursive
    }
    
    
    # step 3: transfer orders to latest workflow version
    foreach( $folder in $topLevelFolders )
    {
        $workflows = Get-JS7Workflow -Folder $folder.Name -Recursive
        foreach( $workflow in $workflows )
        {
            # identify previous workflow versions
            if ( !$workflow.isCurrentVersion )
            {
                # check for non-transferable orders
                $orders = Get-JS7Order -WorkflowPath $workflow.path -WorkflowVersionId $workflow.versionId -Blocked
                if ( $orders.count )
                {
                    Write-Warning "blocked orders found for workflow $($workflow.path), orders will not be transferred to latest workflow version"
                    $blockedOrders += $orders
                }
    
                # check for suspended orders
                $orders = Get-JS7Order -WorkflowPath $workflow.path -WorkflowVersionId $workflow.versionId -Suspended
                if ( $orders.count )
                {
                    Write-Warning "suspended orders found for workflow $($workflow.path), orders will not be resumed"
                    $suspendedOrders += $orders
                }
    
                # suspend in progress and waiting orders
                $orders = ( Get-JS7Order -WorkflowPath $workflow.path -WorkflowVersionId $workflow.versionId -InProgress -Waiting | Suspend-JS7Order )
    
                # transfer orders to latest workflow version
                $orders | Set-JS7Order -Transfer -WorkflowPath $workflow.path -WorkflowVersionId $workflow.versionId
                
                # resume suspended orders
                $orders | Resume-JS7Order
            }
        }
    }
    
    if ( $blockedOrders.count )
    {
        Write-Warning "The following $($blockedOrders.count) blocked orders are preseent and cannot be transferred to latest workflow versions"
        Write-Warning $blockedOrders
    }
    
    if ( $suspendedOrders.count )
    {
        Write-Warning "The following $($suspended.count) suspended orders are preseent and have not beeen transferred to latest workflow versions"
        Write-Warning $suspendedOrders
    }
    
    # step 4: remove scheduling objects not available from archive file
    foreach( $folder in $topLevelFolders )
    {
        $objects = Get-JS7InventoryFolder -Folder $folder.Name -Recursive
        foreach( $object in $objects.PSObject.properties.value )
        {
            if ( $object.id )
            {
                # Write-Output "Test-Path -Path $($archiveDir)$($object.path)$($objectTypesToFileExtensions[$object.objectType])"
                if ( !(Test-Path -Path "$($archiveDir)$($object.path)$($objectTypesToFileExtensions[$object.objectType])") )
                {
                    # Remove-JS7InventoryItem -Path $object.path -Type $object.objectType
                    Write-Output "Remove-JS7InventoryItem -Path $($object.path) -Type $($object.objectType)"
                }
            }
        }
    }
} catch {
    $message = $_.Exception | Format-List -Force | Out-String
    throw "Exception occurred in line number $($_.InvocationInfo.ScriptLineNumber)`n$($message)"
} finally {
    # cleanup
    Remove-Item -Path $archiveDir -Force -Recurse
    Disconnect-JS7
    # Stop-Transcript
}

...