A task describes metadata, state, input/output files, resource requests, commands, and logs.
The task API has four actions: create, get, list, and cancel.
Funnel serves both HTTP/JSON and gRPC/Protobuf.
The Task API is developed via an open standard effort.
Given a task, Funnel will queue it, schedule it to a worker, and track its state and logs.
A worker will download input files, run a sequence of Docker containers, upload output files, and emits events and logs along the way.
We use Funnel on AWS, Google Cloud, OpenStack, and the good ol' university HPC cluster.
A wide variety of options make Funnel easily adaptable:
A task describes metadata, state, input/output files, resource requests, commands, and logs.
For a full description of the task fields,
see the task API docs and the the task schema.
$ funnel examples hello-world
{
"name": "Hello world",
"description": "Demonstrates the most basic echo task.",
"executors": [
{
"image": "alpine",
"command": ["echo", "hello world"],
}
]
}
localhost:8000 is the HTTP API and web dashboard.
localhost:9090 is the gRPC API.
$ funnel server run
server Server listening
httpPort 8000
rpcAddress :9090
The output is the task ID.
This example uses the development server, which will run the task locally via Docker.
$ funnel examples hello-world > hello-world.json
$ funnel task create hello-world.json
b8581farl6qjjnvdhqn0
The output is the task with state and logs.
By default, the CLI returns the "full" task view, which includes all logs plus stdout/err content.
$ funnel task get b8581farl6qjjnvdhqn0
{
"id": "b8581farl6qjjnvdhqn0",
"state": "COMPLETE",
"name": "Hello world",
"description": "Demonstrates the most basic echo task.",
"executors": [
{
"image": "alpine",
"command": [
"echo",
"hello world"
],
}
],
"logs": [
{
"logs": [
{
"startTime": "2017-11-13T21:35:57.548592769-08:00",
"endTime": "2017-11-13T21:36:01.871905687-08:00",
"stdout": "hello world\n"
}
],
"startTime": "2017-11-13T21:35:57.547408797-08:00",
"endTime": "2017-11-13T21:36:01.87496482-08:00"
}
],
"creationTime": "2017-11-13T21:35:57.543528992-08:00"
}
$ funnel task list --view MINIMAL
{
"tasks": [
{
"id": "b8581farl6qjjnvdhqn0",
"state": "COMPLETE"
},
...
]
}
The "run" command makes it easy to quickly create a task. By default, commands are wrapped in "sh -c" and run in the "alpine" container.
Use the "--print" flag to print the task instead of running it immediately.
$ funnel run 'md5sum $src' --in src=~/src.txt --print
{
"name": "sh -c 'md5sum $src'",
"inputs": [
{
"name": "src",
"url": "file:///Users/buchanae/src.txt",
"path": "/inputs/Users/buchanae/src.txt"
}
],
"executors": [
{
"image": "alpine",
"command": [
"sh",
"-c",
"md5sum $src"
],
"env": {
"src": "/inputs/Users/buchanae/src.txt"
}
}
],
}
Tasks can be monitored in a terminal dashboard.
$ funnel dashboard
There's also a web dashboard at http://localhost:8000
Usually you'll want to use a remote Funnel server. For that, there are CLI flags and envionrment variables.
$ funnel -S http://funnel.example.com task list
$ FUNNEL_SERVER="http://funnel.example.com" funnel task list
There's a lot more to learn about tasks and Funnel. More information can be found in the docs and the CLI help.
$ funnel help
Join the Gitter channel.
Head over to GitHub and dig in.
Let us know what you think.