reorging examples/tutorials a bit

This commit is contained in:
Chad Arimura
2017-05-25 14:28:00 -07:00
parent 235a8219c2
commit a565c09c7f
36 changed files with 37 additions and 479 deletions

2
Gopkg.lock generated
View File

@@ -383,7 +383,7 @@ memo = "bd1e1a24b7655bd27880d6b3d752e400a4e36e7b1d7129a1a9e54a11fac75c9c"
branch = "master"
name = "github.com/moby/moby"
packages = ["pkg/jsonmessage"]
revision = "da3c3ec1458588d5d263dc3babd3dca95fdc7d8d"
revision = "e925820bfd5af066497800a02c597d6846988398"
[[projects]]
name = "github.com/opencontainers/go-digest"

View File

@@ -2,7 +2,8 @@
<!-- [![GoDoc](https://godoc.org/github.com/treeder/functions?status.svg)](https://godoc.org/github.com/treeder/functions) -->
Oracle Functions is an open source [serverless](serverless.md) platform, or as we like to refer to it, Functions as a Service (FaaS) platform that you can run anywhere. Some of it's key features:
Oracle Functions is an event-driven, open source, [functions-as-a-service](serverless.md) compute
platform that you can run anywhere. Some of it's key features:
* Write once
* [Any language](docs/faq.md#which-languages-are-supported)
@@ -13,6 +14,7 @@ Oracle Functions is an open source [serverless](serverless.md) platform, or as w
* Easy to use [for developers](docs/README.md#for-developers)
* Easy to manage [for operators](docs/README.md#for-operators)
* Written in [Go](https://golang.org)
* Simple yet powerful extensibility
## Prequisites
@@ -65,14 +67,11 @@ configuration options [here](docs/operating/options.md). If you are on Windows,
-->
### Writing Your First Function
### Your First Function
Functions are small but powerful blocks of code that generally do one simple thing. Forget about monoliths when using functions, just focus on the task that you want the function to perform.
Start with this readme tutorial, and then you can learn more about function best practices in
our section [Writing Functions](docs/writing.md).
The following is a simple Go program that outputs a string to STDOUT. Copy and paste the code below into a file called `func.go`.
The following is a simple Go program that outputs a string to STDOUT. Copy and paste the code below into a file called `func.go`. Currently the function must be named func.your_language_extention (ie func.go, func.js, etc.)
```go
package main
@@ -82,30 +81,30 @@ import (
)
func main() {
fmt.Println("Boom. Oracle Functions.")
fmt.Println("Hello from Oracle Functions!")
}
```
Now run the following commands to build your function and deploy it:
Now run the following CLI commands:
```sh
# Create your first application
fn apps create myapp
# Initilizes your function w/ prebuilt func.yaml
# Replace $USERNAME with your DockerHub username
fn init $USERNAME/hello
# Initialize your function
# This detects your runtime from the code above and creates a func.yaml
fn init <DOCKERHUB_USERNAME>/hello
# Test your function
# This will run inside a container exactly how it will on the server
fn run
# Deploy it to your functions server (default localhost:8080)
# Deploy your functions to the Oracle Functions server (default localhost:8080)
# This will create a route to your function as well
fn deploy myapp
```
Boom. Now you can call your function:
Now you can call your function:
```sh
curl http://localhost:8080/r/myapp/hello
@@ -116,36 +115,32 @@ Or in a browser: [http://localhost:8080/r/myapp/hello](http://localhost:8080/r/m
That's it! You just deployed your first function and called it. Now to update your function
you can update your code and run ```fn deploy myapp``` again.
## Learning More
## To Learn More
### Documentation
- Walk through the following [tutorial series](docs/tutorial)
- See our [full documentation](docs/README.md)
- View our [examples directory](/examples)
- You can also write your functions in AWS [Lambda format](docs/lambda/README.md)
See [docs/](docs/README.md) for full documentation.
## Get Involved
More on [Writing Functions](docs/writing.md).
And you can find a bunch of examples in the [/examples](/examples) directory.
You can also write your functions in AWS's [Lambda format](docs/lambda/README.md).
### Get Involved
TODO: Slack or Discord community.
See [contributing](CONTRIBUTING.md).
- TODO: Slack or Discord community
- Learn how to [contribute](CONTRIBUTING.md)
- See [milestones](https://gitlab.oracledx.com/odx/functions/milestones) for detailed issues
## Functions UI
## User Interface
This is the graphical user interface for Oracle Functions. It is currently not buildable.
```sh
docker run --rm -it --link functions:api -p 4000:4000 -e "API_URL=http://api:8080" treeder/functions-ui
```
For more information, see: https://github.com/treeder/functions-ui
For more information, see: [https://github.com/treeder/functions-ui](https://github.com/treeder/functions-ui)
## Roadmap
See [milestones](https://gitlab.oracledx.com/odx/functions/milestones) for detailed issues.
## Next up: Walk through the following [tutorial series](docs/tutorial/) -->

View File

@@ -1,9 +1,7 @@
# Example Functions
This directory has a collection of example functions you can look at to learn more about how to write them
or just copy one and build on it to get started faster.
This directory has a collection of example functions you can look at to learn more about how to write them or just copy one and build on it to get started faster.
## Hello World Examples
## Tutorial Series
The [Hello World examples](hello/) are the most basic functions you can write and we'll try to have an example in most major languages.
This is a good place to start and good examples to copy and build upon.
The [Tutorial Series](tutorial/) will demonstrate some of Oracle Functions capabilities through a series of exmaples. We'll try to examples in most major languages. This is a great place to start!

View File

@@ -1,7 +0,0 @@
vendor/
/hello
/go
/app
/__uberscript__
func.yaml

View File

@@ -1,27 +0,0 @@
# Quick Example for a Go Function (3 minutes)
This example will show you how to test and deploy Go (Golang) code to Oracle Functions.
```sh
# create your func.yaml file
fn init <YOUR_DOCKERHUB_USERNAME>/hello
# build the function
fn build
# test it
cat hello.payload.json | fn run
# push it to Docker Hub
fn push
# Create a route to this function on Oracle Functions
fn routes create myapp /hello
```
Now you can call your function on Oracle Functions:
```sh
curl -H "Content-Type: application/json" -X POST -d @hello.payload.json http://localhost:8080/r/myapp/hello
```
## Dependencies
Be sure you're dependencies are in the `vendor/` directory and that's it.

View File

@@ -1,17 +0,0 @@
package main
import (
"encoding/json"
"fmt"
"os"
)
type Person struct {
Name string
}
func main() {
p := &Person{Name: "World"}
json.NewDecoder(os.Stdin).Decode(p)
fmt.Printf("Hello %v!", p.Name)
}

View File

@@ -1,3 +0,0 @@
{
"name": "Johnny"
}

View File

@@ -1,3 +0,0 @@
node_modules/
func.yaml
Dockerfile

View File

@@ -1,41 +0,0 @@
## Quick Example for a NodeJS Function (4 minutes)
This example will show you how to test and deploy a Node function to Oracle Functions.
```sh
# create your func.yaml file
fn init <YOUR_DOCKERHUB_USERNAME>/hello
# build the function
fn build
# test it
cat hello.payload.json | fn run
# push it to Docker Hub
fn push
# Create a route to this function on Oracle Functions
fn routes create myapp /hello
```
Now surf to: http://localhost:8080/r/myapp/hello
## Dependencies
Create a [package.json](https://docs.npmjs.com/getting-started/using-a-package.json) file in your functions directory.
Run:
```sh
docker run --rm -v "$PWD":/function -w /function funcy/node:dev npm install
```
Then everything should work.
For example, using the `package.json` file in this directory which includes the [request](https://www.npmjs.com/package/request) package, you can add this to func.js and it will work:
```js
var request = require('request');
request('http://www.google.com', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // Show the HTML for the Google homepage.
}
})
```

View File

@@ -1,9 +0,0 @@
name = "World";
fs = require('fs');
try {
obj = JSON.parse(fs.readFileSync('/dev/stdin').toString())
if (obj.name != "") {
name = obj.name
}
} catch(e) {}
console.log("Hello", name, "from Node!");

View File

@@ -1,3 +0,0 @@
{
"name": "Johnny"
}

View File

@@ -1,7 +0,0 @@
{
"name": "my-awesome-func",
"version": "1.0.0",
"dependencies": {
"request": "^2.78.0"
}
}

View File

@@ -1 +0,0 @@
vendor/

View File

@@ -1,6 +0,0 @@
FROM funcy/php
WORKDIR /app
ADD . /app
ENTRYPOINT ["php", "hello.php"]

View File

@@ -1,48 +0,0 @@
## Quick Example for a PHP Function (4 minutes)
This example will show you how to test and deploy Go (Golang) code to Oracle Functions.
### 1. Prepare the `func.yaml` file:
At func.yaml you will find:
```yml
name: USERNAME/hello
version: 0.0.1
path: /hello
build:
- docker run --rm -v "$PWD":/worker -w /worker funcy/php:dev composer install
```
The important step here is to ensure you replace `USERNAME` with your Docker Hub account name. Some points of note:
the application name is `phpapp` and the route for incoming requests is `/hello`. These informations are relevant for
the moment you try to test this function.
### 2. Build:
```sh
# build the function
fn build
# test it
cat hello.payload.json | fn run
# push it to Docker Hub
fn push
# Create a route to this function on Oracle Functions
fn routes create phpapp /hello
```
`-v` is optional, but it allows you to see how this function is being built.
### 3. Queue jobs for your function
Now you can start jobs on your function. Let's quickly queue up a job to try it out.
```sh
cat hello.payload.json | fn call phpapp /hello
```
Here's a curl example to show how easy it is to do in any language:
```sh
curl -H "Content-Type: application/json" -X POST -d @hello.payload.json http://localhost:8080/r/phpapp/hello
```

View File

@@ -1,4 +0,0 @@
{
"require": {
}
}

View File

@@ -1,5 +0,0 @@
name: USERNAME/hello
version: 0.0.1
path: /hello
build:
- docker run --rm -v "$PWD":/worker -w /worker funcy/php:dev composer install

View File

@@ -1,3 +0,0 @@
{
"name": "Johnny"
}

View File

@@ -1,10 +0,0 @@
<?php
require 'vendor/autoload.php';
stream_set_blocking(STDIN, 0);
$payload = json_decode(file_get_contents("php://stdin"), true);
if (isset($payload['name'])) {
echo "Hello ", $payload['name'],"!\n\n";
} else {
echo "Hello World!\n\n";
}

View File

@@ -1,2 +0,0 @@
packages/
func.yaml

View File

@@ -1,6 +0,0 @@
FROM funcy/python:2
WORKDIR /app
ADD . /app
ENTRYPOINT ["python", "hello.py"]

View File

@@ -1,48 +0,0 @@
## Quick Example for a Python Function (4 minutes)
This example will show you how to test and deploy Go (Golang) code to Oracle Functions.
### 1. Prepare the `func.yaml` file:
At func.yaml you will find:
```yml
name: USERNAME/hello
version: 0.0.1
path: /hello
build:
- docker run --rm -v "$PWD":/worker -w /worker funcy/python:2-dev pip install -t packages -r requirements.txt
```
The important step here is to ensure you replace `USERNAME` with your Docker Hub account name. Some points of note:
the application name is `pythonapp` and the route for incoming requests is `/hello`. These informations are relevant for
the moment you try to test this function.
### 2. Build:
```sh
# build the function
fn build
# test it
cat hello.payload.json | fn run
# push it to Docker Hub
fn push
# Create a route to this function on Oracle Functions
fn routes create pythonapp /hello
```
`-v` is optional, but it allows you to see how this function is being built.
### 3. Queue jobs for your function
Now you can start jobs on your function. Let's quickly queue up a job to try it out.
```sh
cat hello.payload.json | fn call pythonapp /hello
```
Here's a curl example to show how easy it is to do in any language:
```sh
curl -H "Content-Type: application/json" -X POST -d @hello.payload.json http://localhost:8080/r/pythonapp/hello
```

View File

@@ -1,3 +0,0 @@
{
"name": "Johnny"
}

View File

@@ -1,12 +0,0 @@
import sys
sys.path.append("packages")
import os
import json
name = "World"
if not os.isatty(sys.stdin.fileno()):
obj = json.loads(sys.stdin.read())
if obj["name"] != "":
name = obj["name"]
print "Hello", name, "!!!"

View File

@@ -1,5 +0,0 @@
bundle/
.bundle/
func.yaml
Dockerfile
Gemfile.lock

View File

@@ -1,4 +0,0 @@
source 'https://rubygems.org'
gem 'httparty', '~> 0.14.0'
gem 'json', '> 1.8.2'

View File

@@ -1,44 +0,0 @@
## Quick Example for a Ruby Function (4 minutes)
This example will show you how to test and deploy a Ruby function to Oracle Functions.
```sh
# create your func.yaml file
fn init <YOUR_DOCKERHUB_USERNAME>/hello
# install dependencies, we need the json gem to run this
docker run --rm -it -v ${pwd}:/worker -w /worker funcy/ruby:dev bundle install --standalone --clean
# build the function
fn build
# test it
cat hello.payload.json | fn run
# push it to Docker Hub
fn push
# Create a route to this function on Oracle Functions
fn routes create myapp /hello
```
Now surf to: http://localhost:8080/r/myapp/hello
## Dependencies
Create a [Gemfile](http://bundler.io/gemfile.html) file in your function directory, then run:
```sh
docker run --rm -it -v ${pwd}:/worker -w /worker funcy/ruby:dev bundle install --standalone --clean
```
Ruby doesn't pick up the gems automatically, so you'll have to add this to the top of your `func.rb` file:
```ruby
require_relative 'bundle/bundler/setup'
```
Open `func.rb` to see it in action.
To update dependencies:
```sh
docker run --rm -it -v ${pwd}:/worker -w /worker funcy/ruby:dev bundle update
# then install again to vendor them
docker run --rm -it -v ${pwd}:/worker -w /worker funcy/ruby:dev bundle update
```

View File

@@ -1,12 +0,0 @@
require_relative 'bundle/bundler/setup'
require 'json'
name = "World"
payload = STDIN.read
if payload != ""
payload = JSON.parse(payload)
name = payload['name']
end
puts "Hello #{name} from Ruby!"

View File

@@ -1,3 +0,0 @@
{
"name": "Johnny"
}

View File

@@ -1,6 +0,0 @@
[package]
name = "func"
version = "0.1.0"
authors = ["Seif Lotfy <seif@iron.io>"]
[dependencies]

View File

@@ -1,33 +0,0 @@
# Using rust with functions
The easiest way to create a function in rust is via ***cargo*** and ***fn***.
## Prerequisites
First create an epty rust project as follows:
```bash
cargo init --name func --bin
```
Make sure the project name is ***func*** and is of type ***bin***. Now just edit your code, once done you can create a function.
## Creating a function
Simply run
```bash
fn init --runtime=rust <username>/<funcname>
```
This will create the ```func.yaml``` file required by functions, which can be built by running:
```bash
fn build
```
## Testing
```bash
fn run
```

View File

@@ -1,10 +0,0 @@
use std::io;
use std::io::Read;
fn main() {
let mut buffer = String::new();
let stdin = io::stdin();
if stdin.lock().read_to_string(&mut buffer).is_ok() {
println!("Hello {}", buffer.trim());
}
}

View File

@@ -1,45 +0,0 @@
package main
import (
"bufio"
"bytes"
"fmt"
"io/ioutil"
"net/http"
"os"
"strconv"
)
func main() {
for {
res := http.Response{
Proto: "HTTP/1.1",
ProtoMajor: 1,
ProtoMinor: 1,
StatusCode: 200,
Status: "OK",
}
r := bufio.NewReader(os.Stdin)
req, err := http.ReadRequest(r)
var buf bytes.Buffer
if err != nil {
res.StatusCode = 500
res.Status = http.StatusText(res.StatusCode)
fmt.Fprintln(&buf, err)
} else {
l, _ := strconv.Atoi(req.Header.Get("Content-Length"))
p := make([]byte, l)
r.Read(p)
fmt.Fprintf(&buf, "Hello %s\n", p)
for k, vs := range req.Header {
fmt.Fprintf(&buf, "ENV: %s %#v\n", k, vs)
}
}
res.Body = ioutil.NopCloser(&buf)
res.ContentLength = int64(buf.Len())
res.Write(os.Stdout)
}
}

View File

@@ -1,9 +0,0 @@
{"route":{
"app_name": "myapp",
"path": "/hot",
"image": "USERNAME/hchttp",
"memory": 64,
"type": "sync",
"config": null,
"format": "http"
}}

View File

@@ -17,8 +17,8 @@ import (
"strings"
"gitlab.oracledx.com/odx/functions/fn/langs"
"github.com/urfave/cli"
"gitlab.oracledx.com/odx/functions/fn/langs"
)
var (
@@ -157,9 +157,10 @@ func (a *initFnCmd) buildFuncFile(c *cli.Context) error {
return err
}
a.runtime = rt
fmt.Printf("assuming %v runtime\n", rt)
fmt.Printf("Found %v, assuming %v runtime.\n", rt, rt)
} else {
fmt.Println("Runtime:", a.runtime)
}
fmt.Println("runtime:", a.runtime)
if _, ok := acceptableFnRuntimes[a.runtime]; !ok {
return fmt.Errorf("init does not support the %s runtime, you'll have to create your own Dockerfile for this function", a.runtime)
}
@@ -180,7 +181,7 @@ func (a *initFnCmd) buildFuncFile(c *cli.Context) error {
}
}
if a.entrypoint == "" && a.cmd == "" {
return fmt.Errorf("could not detect entrypoint or cmd for %v, use --entrypoint and/or --cmd to set them explicitly", a.runtime)
return fmt.Errorf("Could not detect entrypoint or cmd for %v, use --entrypoint and/or --cmd to set them explicitly", a.runtime)
}
return nil
@@ -193,5 +194,5 @@ func detectRuntime(path string) (runtime string, err error) {
return runtime, nil
}
}
return "", fmt.Errorf("no supported files found to guess runtime, please set runtime explicitly with --runtime flag")
return "", fmt.Errorf("No supported files found to guess runtime, please set runtime explicitly with --runtime flag")
}