Python 3 language support for Dispatch
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
ci
example
function-server
function-template
image-template
tests
validator
.gitignore
Dockerfile
LICENSE
README.md
build.sh
version.txt

README.md

python3-base-image

Python 3 language support for Dispatch

Latest image on Docker Hub

Usage

You need a recent version of Dispatch installed in your Kubernetes cluster, Dispatch CLI configured to use it.

Adding the Base Image

To add the base-image to Dispatch:

$ dispatch create base-image python3-base dispatchframework/python3-base:<tag>

Make sure the base-image status is READY (it normally goes from INITIALIZED to READY):

$ dispatch get base-image python3-base

Adding Runtime Dependencies

Library dependencies listed in requirements.txt (pip dependency manifest) need to be wrapped into a Dispatch image. For example, suppose we need a HTTP library:

$ cat ./requirements.txt
requests
$ dispatch create image python3-mylibs python3-base --runtime-deps ./requirements.txt

Make sure the image status is READY (it normally goes from INITIALIZED to READY):

$ dispatch get image python3-mylibs

Creating Functions

Using the python3 base-image, you can create Dispatch functions from python source files. The file can require any libraries from the image (see above).

The only requirement is: a function called handle must be defined that accepts 2 arguments (context and payload), for example:

$ cat ./http_func.py
import requests

def handle(context, payload):
    url = payload.get("url", "http://example.com")
    resp = requests.get(url)
    return {"status": resp.status_code}
$ dispatch create function http ./http_func.py --image=python3-mylibs --handler=http_func.handle

Make sure the function status is READY (it normally goes from INITIALIZED to READY):

$ dispatch get function http

Running Functions

As usual:

$ dispatch exec --json --input '{"url": "http://dispatchframework.io"}' --wait http
{
    "blocking": true,
    "executedTime": 1524768025,
    "faasId": "09e3c92a-a9e5-438c-b627-84a100c041d5",
    "finishedTime": 1524768025,
    "functionId": "6f5d49a6-3a5a-43d2-ab60-7bef6b3d0b71",
    "functionName": "http",
    "input": {
        "url": "http://dispatchframework.io"
    },
    "logs": {
        "stderr": null,
        "stdout": null
    },
    "name": "e7ef9a88-ff3e-48b6-a331-b350dbde293e",
    "output": {
        "status": 200
    },
    "reason": null,
    "secrets": [],
    "services": null,
    "status": "READY",
    "tags": []
}

Error Handling

There are three types of errors that can be thrown when invoking a function:

  • InputError
  • FunctionError
  • SystemError

SystemError represents an error in the Dispatch infrastructure. InputError represents an error in the input detected either early in the function itself or through input schema validation. FunctionError represents an error in the function logic or an output schema validation error.

Functions themselves can either throw InputError or FunctionError

Input Validation

For Python, the following exceptions thrown from the function are considered InputError:

  • ValueError
  • TypeError

All other exceptions thrown from the function are considered FunctionError.

To validate input in the function body:

def lower(ctx, payload):
    if type(payload) is not str:
        raise TypeError("payload is not of type str")

    return payload.lower()

Note

Since ValueError and TypeError are considered InputError, functions should not throw them unless explicitly thrown due to an input validation error. Functions should catch and handle them accordingly if they should not be classified as InputError.

Running Tests

To run tests, ensure you have all the required dependencies:

pip install -r ./function-server/requirements.txt

Then run:

python3 -m unittest discover