Script Visualisation
Engine creates a visual representation of scripts in your flows, schedulers, or wrappers.
Concept
Using static code analysis Engine extracts the control-flow and several key-commands of your scripts. This data is used to create a flowchart.
Features
Child Flow
Child flows are visualised as a squared box with a code icon.
import flow_api
def handler(system: flow_api.System, this: flow_api.Execution, inputs: dict):
    this.flow('child')
    return this.success('all done')

a child flow execution visualised
Child Connection
Child connection are visualised as a squared box with a plug icon.
import flow_api
def handler(system: flow_api.System, this: flow_api.Execution, inputs: dict):
    this.connect(
        'server',
        name='read diskspace',
        script='df -B1',
    )
    return this.success('all done')

a child connection execution visualised
Condition
Conditions are visualised as a rhomb shape with "true" and "false" lines.
import flow_api
def handler(system: flow_api.System, this: flow_api.Execution, inputs: dict):
    if condition:
        this.flow('child A')
    else:
        this.flow('child B')
    return this.success('all done')

a condition visualised
For Loop
For loops are visualised using a box containing the looping body.
import flow_api
def handler(system: flow_api.System, this: flow_api.Execution, inputs: dict):
    for count in range(3):
        this.flow('child')
    return this.success('all done')

a for loop visualised
While Loop
While loops are visualised using a box containing the looping body.
import flow_api
def handler(system: flow_api.System, this: flow_api.Execution, inputs: dict):
    while condition:
        this.flow('child')
    return this.success('all done')

a while loop visualised
Exception Handler
Exception handlers are visualised using a box containing the try body. There are lines for each exception type being caught and one line for the "else" path (no exception).
import flow_api
def handler(system: flow_api.System, this: flow_api.Execution, inputs: dict):
    try:
        this.flow('child A')
    except flow_api.DependencyFailedError:
        this.flow('child B')
    else:
        this.flow('child C')
    return this.success('all done')

an exception handler visualised
Return
Returning success or error is visualized using a colored rounded square.
import flow_api
def handler(system: flow_api.System, this: flow_api.Execution, inputs: dict):
    if condition:
        return this.error('failed')
    else:
        return this.success('all done')

return states visualised
Combined Example
An example using various of the control structures.
import flow_api
def handler(system: flow_api.System, this: flow_api.Execution, inputs: dict):
    server_names = system.setting('monitor-servers').get('value')
    for server_name in server_names:
        output = this.connect(
            server_name,
            name='read diskspace',
            script='df -B1 /',
        ).get('output_value')['report']
        available_bytes = int(report.split(' ')[3])
        if available_bytes < 5*1024**3:  # less than 5 GiB available
            try:
                this.flow('clean caches', server_name=server_name)
            except flow_api.DependencyFailedError:
                return this.error('failed to clean caches')
        else:
            this.connect(
                f'{server_name}-scp',
                name='copy files',
                src='cloudomation:backup.zip',
                dst='/backups/backup.zip',
            )
            break
    return this.success('all done')

visualisation of example script