Implementing a workflow provider
In Running Renku on HPC, we described how using different workflow providers can enable the user running renku workflows on HPC. Here we discuss how to implement a new, custom workflow provider as a plugin for Renku CLI.
Renku provides the option to add a new workflow executor backend with the help of pluggy plugins.
In order to implement such a plugin, the developer of the new workflow
provider plugin should provide the new executor implementation by
implementing the IWorkflowProvider interface.
A simple example of a MyProvider workflow executor plugin:
from pathlib import Path from typing import Any, Dict, List from renku.domain_model.workflow.provider import IWorkflowProvider from renku.core.plugin import hookimpl class MyProvider(IWorkflowProvider): @hookimpl def workflow_provider(self): """Workflow provider name.""" return (self, "my") @hookimpl def workflow_execute(self, dag: "nx.DiGraph", basedir: Path, config: Dict[str, Any]): """Executing the ``Plans``.""" generated_outputs: List[str] = [] # traversing the dag that contains the ``Plans`` # and executing each plan in the graph ... return generated_outputs
The execution of the workflow(s) shall be defined in workflow_execute function, where
dagis a Directed Acyclic Graph ofPlansto be executed represented with a networkx.DiGraph,
basediris the absolute path to the project,
configdictionary contains the provider related optional configuration parameters.
The workflow_provider function shall return a tuple of (object, str), where object
should be the plugin object, i.e. self and the string is a unique identifier of the
provider plugin. This unique string will be the string that the user can provide to the
--provider command line argument to select this plugin for executing the desired
workflows. A dummy provider implementation is available
here in order to ease the
initial implementation of a provider plugin.
A provider HAS to set environment variables for a plans parameters, so they can be used by scripts.
These environment variables have to be prefixed with the value of the
renku.core.plugin.provider.RENKU_ENV_PREFIX constant. So for a parameter with name
my-param and the RENKU_ENV_PREFIX value of RENKU_ENV_, the environment variable
should be called RENKU_ENV_my-param.