Skip to content

Another issue with graph analysis and conditional branches: error handler #159

Description

@woutdenolf
import logging
from ewoks import execute_graph
from ewokscore.task import Task


class MyError(Exception):
    pass


class Dummy(Task, optional_input_names=["raise_error"]):
    def run(self):
        if self.inputs.raise_error:
            raise MyError(f"Error raise in {self.label!r}")
        else:
            print(self.label, "Done")


class Error(Task, optional_input_names=["WorkflowExceptionInstance"]):
    def run(self):
        print(
            f"Error captured in {self.label!r}: {self.inputs.WorkflowExceptionInstance}"
        )


node_locate_data = {
    "id": "locate_data",
    "task_type": "class",
    "force_start_node": True,
    "task_identifier": "__main__.Dummy",
}

node_termination = {
    "id": "terminate",
    "task_type": "class",
    "task_identifier": "__main__.Error",
}


node_setup_workdir = {
    "id": "setup_workdir",
    "task_type": "class",
    "task_identifier": "__main__.Dummy",
}

node_load_master = {
    "id": "load_master",
    "task_type": "class",
    "task_identifier": "__main__.Dummy",
}

node_load_metadata = {
    "id": "load_metadata",
    "task_type": "class",
    "task_identifier": "__main__.Dummy",
}

node_draw_plots = {
    "id": "draw_plots",
    "task_type": "class",
    "task_identifier": "__main__.Dummy",
}

link_termination = {
    "source": "locate_data",
    "target": "terminate",
    "on_error": True,
}

link_locate_to_setup = {
    "source": "locate_data",
    "target": "setup_workdir",
}

link_locate_to_master = {
    "source": "locate_data",
    "target": "load_master",
}

link_locate_to_metadata = {
    "source": "locate_data",
    "target": "load_metadata",
}

link_setup_to_master = {
    "source": "setup_workdir",
    "target": "load_master",
}

link_setup_to_metadata = {
    "source": "setup_workdir",
    "target": "load_metadata",
}

link_master_to_draw = {
    "source": "load_master",
    "target": "draw_plots",
}

link_metadata_to_draw = {
    "source": "load_metadata",
    "target": "draw_plots",
}


workflow = {
    "graph": {"id": "workflow_ID29ESRF_draw_foil_2Dmap"},
    "nodes": [
        node_locate_data,
        node_termination,
        node_setup_workdir,
        node_load_master,
        node_load_metadata,
        node_draw_plots,
    ],
    "links": [
        link_termination,
        link_locate_to_setup,
        link_locate_to_master,
        link_locate_to_metadata,
        link_setup_to_master,
        link_setup_to_metadata,
        link_master_to_draw,
        link_metadata_to_draw,
    ],
}

print("\nSTART\n")
logging.basicConfig(level=logging.CRITICAL)

execute_graph(
    workflow,
    engine="ppf",
    pool_type="thread",
    inputs=[{"name": "raise_error", "value": False, "id": "locate_data"}],
)
print("\nEXIT\n")
Image
START

locate_data Done
setup_workdir Done
load_master Done
load_master Done
load_metadata Done
draw_plots Done
draw_plots Done
draw_plots Done
load_metadata Done
draw_plots Done

EXIT

ewoksppf sees this:

locate_data -> terminate required=False
locate_data -> setup_workdir required=True
locate_data -> load_master required=True
locate_data -> load_metadata required=True
setup_workdir -> load_master required=False          ????
setup_workdir -> load_metadata required=False     ????
load_master -> draw_plots required=False               ????
load_metadata -> draw_plots required=False

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions