Skip to content

globocom/functions

Repository files navigation

TestsNo Maintenance Intended

DEPRECATED! Backstage Functions

Backstage Functions is an Open Source Serverless Platform able to store and execute code.

NOTE: This is no longer maintained, please consider using other serverless engine projects like fn or OpenFaaS instead.

Benefits

  • Your code will be executed in an isolated environment
  • You don't have to worry about infrastructure
  • Functions can be called at any time by any project

FAQ

  • Which languages are supported? Currently, only Javascript.

  • Is it based on events? Not yet.

  • How the code execution happens in an isolated way? It uses the Backstage Functions Sandbox.

Running locally without Docker

Requirements

  • Redis 3.0+
  • NodeJS 8.13.0

Download the project

git clone https://github.com/backstage/functions.git

Setup

make setup

Run

make run

Configuration

To format your log in json, please run:

export LOG_APP_FORMAT=json

Running locally via Docker

Requirements

  • Docker 1.12+
  • Docker compose 1.8+

Download docker-compose.yml

mkdir functions cd functions curl 'https://raw.githubusercontent.com/backstage/functions/master/docker-compose.yml'> docker-compose.yml

Run

docker-compose up

How to use

Function Structure

Your function will have a file, which you define any name you want, and it has to have a function called main, with two parameters: req and res. Req represents the Request and Res represents the Response. At the end of your code, you'll have to use the send method.

Example of a function

functionmain(req,res){constname=(req.body&&req.body.name)||"World"res.send({say: `Hello ${name}!`})}

Setting a function

To set your function, you can make a PUT request to /functions/:namespace/:name:

curl -i -X PUT http://localhost:8100/functions/example/hello-world \ -H 'content-type: application/json' \ -d '{"code":"function main(req, res){\n const name = (req.body && req.body.name) || \"World\"\n res.send({say: `Hello ${name}! Nice meeting you...` })\n}\n"}'

Ps: if it doesn't exists, it will be created

Deleting a function

To delete your function, you can make a DELETE request to /functions/:namespace/:name:

curl -i -X DELETE http://localhost:8100/functions/example/hello-world \ -H 'content-type: application/json'

Executing a function

To execute a function, you can make a PUT request to /functions/:namespace/:name/run:

curl -i -X PUT http://localhost:8100/functions/example/hello-world/run \ -H 'content-type: application/json'

The result will be something like:

HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Content-Length: 22 ETag: W/"16-soBGetwJPBLt8CqWpBQu+A" Date: Tue, 11 Oct 2016 16:51:04 GMT Connection: keep-alive{"say":"Hello World!"}

If one needs to pass an object in the request, the payload is executed:

curl -i -X PUT http://localhost:8100/functions/example/hello-world/run \ -H 'content-type: application/json' \ -d '{"name": "Pedro"}'

The result will be something like:

HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Content-Length: 22 ETag: W/"16-Ino2/umXaZ3xVEhoqyS8aA" Date: Tue, 11 Oct 2016 17:13:11 GMT Connection: keep-alive{"say":"Hello Pedro!"}

Executing functions in a pipeline

To execute many functions in a pipeline, you can make a PUT request to /functions/pipeline:

// Function0functionmain(req,res){\ res.send({x: req.body.x*10});}// Function1functionmain(req,res){res.send({x: req.body.x*20});}
curl -g -i -X PUT 'http://localhost:8100/functions/pipeline?steps[0]=namespace/function0&steps[1]=namespace/function1' \ -H 'content-type: application/json' -d '{"x": 1}' 

Considering the curl above, the pipeline result would be like this:

HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Content-Length: 22 ETag: W/"16-Ino2/umXaZ3xVEhoqyS8aA" Date: Tue, 11 Oct 2016 17:13:11 GMT Connection: keep-alive{"x": 200}

About

DEPRECATED: An Open Source Serverless Platform

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 20

Languages