diff --git a/api/server/runner.go b/api/server/runner.go index 766a0b545..c73795075 100644 --- a/api/server/runner.go +++ b/api/server/runner.go @@ -128,12 +128,10 @@ func handleRequest(c *gin.Context, enqueue models.Enqueue) { // app config for k, v := range app.Config { - envVars[ToEnvName("CONFIG", k)] = v + envVars[ToEnvName("", k)] = v } - - // route config for k, v := range found.Config { - envVars[ToEnvName("CONFIG", k)] = v + envVars[ToEnvName("", k)] = v } // params diff --git a/api/server/runner_async_test.go b/api/server/runner_async_test.go index 372f37fd8..951b9c402 100644 --- a/api/server/runner_async_test.go +++ b/api/server/runner_async_test.go @@ -49,21 +49,21 @@ func TestRouteRunnerAsyncExecution(t *testing.T) { expectedCode int expectedEnv map[string]string }{ - {"/r/myapp/myroute", ``, map[string][]string{}, http.StatusOK, map[string]string{"CONFIG_TEST": "true", "CONFIG_APP": "true"}}, + {"/r/myapp/myroute", ``, map[string][]string{}, http.StatusOK, map[string]string{"TEST": "true", "APP": "true"}}, { "/r/myapp/myroute/1", ``, map[string][]string{"X-Function": []string{"test"}}, http.StatusOK, map[string]string{ - "CONFIG_TEST": "true", - "CONFIG_APP": "true", + "TEST": "true", + "APP": "true", "PARAM_PARAM": "1", "HEADER_X_FUNCTION": "test", }, }, - {"/r/myapp/myerror", ``, map[string][]string{}, http.StatusOK, map[string]string{"CONFIG_TEST": "true", "CONFIG_APP": "true"}}, - {"/r/myapp/myroute", `{ "name": "test" }`, map[string][]string{}, http.StatusOK, map[string]string{"CONFIG_TEST": "true", "CONFIG_APP": "true"}}, + {"/r/myapp/myerror", ``, map[string][]string{}, http.StatusOK, map[string]string{"TEST": "true", "APP": "true"}}, + {"/r/myapp/myroute", `{ "name": "test" }`, map[string][]string{}, http.StatusOK, map[string]string{"TEST": "true", "APP": "true"}}, } { body := bytes.NewBuffer([]byte(test.body)) diff --git a/docs/apps.md b/docs/apps.md index 5cccc8e69..5091c3395 100644 --- a/docs/apps.md +++ b/docs/apps.md @@ -7,7 +7,7 @@ Applications are the top level object that groups routes together to create an A When creating or updating an app, you can pass in a map of config variables. `config` is a map of values passed to the route runtime in the form of -environment variables prefixed with `CONFIG_`. +environment variables. Note: Route level configuration overrides app level configuration. diff --git a/docs/operating/routes.md b/docs/operating/routes.md index 8534bc76a..88c7327be 100644 --- a/docs/operating/routes.md +++ b/docs/operating/routes.md @@ -20,7 +20,7 @@ dispatches a new request, gets a task ID back and closes the HTTP connection. Default: `sync`. `config` is a map of values passed to the route runtime in the form of -environment variables prefixed with `CONFIG_`. +environment variables. Note: Route level configuration overrides app level configuration. diff --git a/docs/writing.md b/docs/writing.md index 6a3ab5916..27eb7271f 100644 --- a/docs/writing.md +++ b/docs/writing.md @@ -1,6 +1,6 @@ # Writing Functions -This will give you the basic overview of writing base level functions. You can also use higher level +This will give you the basic overview of writing base level functions. You can also use higher level abstractions that make it easier such as [lambda](lambda/README.md). Also, for complete examples in various languages, see the [examples directory](/examples). @@ -16,7 +16,7 @@ body = JSON.parse(STDIN) # Do something return_struct = doSomething(body) -# Respond if sync: +# Respond if sync: STDOUT.write(JSON.generate(return_struct)) # or update something if async db.update(return_struct) @@ -24,27 +24,27 @@ db.update(return_struct) ## Inputs -Inputs are provided through standard input and environment variables. We'll just talk about the default input format here, but you can find others [here](function-format.md). -To read in the function body, just read from STDIN. +Inputs are provided through standard input and environment variables. We'll just talk about the default input format here, but you can find others [here](function-format.md). +To read in the function body, just read from STDIN. -You will also have access to a set of environment variables. +You will also have access to a set of environment variables. * REQUEST_URL - the full URL for the request * ROUTE - the matched route * METHOD - the HTTP method for the request -* CONFIG_X - any configuration values you've set for the Application or the Route. Replace X with the upper cased name of the config variable you set. -* HEADER_X - the HTTP headers that were set for this request. Replace X with the upper cased name of the header and replace dashes in the header with underscores. +* HEADER_X - the HTTP headers that were set for this request. Replace X with the upper cased name of the header and replace dashes in the header with underscores. +* any configuration values you've set for the Application or the Route. Replace X with the upper cased name of the config variable you set. Warning: these may change before release. ## Logging -Standard out is where you should write response data for synchronous functions. Standard error -is where you should write for logging, as [it was intended](http://www.jstorimer.com/blogs/workingwithcode/7766119-when-to-use-stderr-instead-of-stdout). +Standard out is where you should write response data for synchronous functions. Standard error +is where you should write for logging, as [it was intended](http://www.jstorimer.com/blogs/workingwithcode/7766119-when-to-use-stderr-instead-of-stdout). -So to write output to logs, simply log to STDERR. Here are some examples in a few languages. +So to write output to logs, simply log to STDERR. Here are some examples in a few languages. -In Go, simply use the [log](https://golang.org/pkg/log/) package, it writes to STDERR by default. +In Go, simply use the [log](https://golang.org/pkg/log/) package, it writes to STDERR by default. ```go log.Println("hi") diff --git a/examples/blog/README.md b/examples/blog/README.md index 47dc1a23f..24f786021 100644 --- a/examples/blog/README.md +++ b/examples/blog/README.md @@ -116,12 +116,12 @@ This command should return `{"error":"Invalid authentication"}` because we aren' First let's create our blog user. In this example an user `test` with password `test`. ``` -docker run --rm -e CONFIG_DB=$MONGODB -e NEWUSER='{ "username": "test", "password": "test" }' $USERNAME/functions-blog +docker run --rm -e DB=$MONGODB -e NEWUSER='{ "username": "test", "password": "test" }' $USERNAME/functions-blog ``` ##### Getting authorization token -Now, to get authorized to post in our Blog API endpoints we must request a new token with a valid user. +Now, to get authorized to post in our Blog API endpoints we must request a new token with a valid user. ``` curl -X POST --data '{ "username": "test", "password": "test" }' http://$FUNCAPI/r/blog/token diff --git a/examples/blog/function.go b/examples/blog/function.go index 75ca27e67..3957ae758 100644 --- a/examples/blog/function.go +++ b/examples/blog/function.go @@ -15,7 +15,7 @@ var noAuth = map[string]interface{}{} func main() { request := fmt.Sprintf("%s %s", os.Getenv("METHOD"), os.Getenv("ROUTE")) - dbURI := os.Getenv("CONFIG_DB") + dbURI := os.Getenv("DB") if dbURI == "" { dbURI = "127.0.0.1/blog" } diff --git a/examples/blog/test.sh b/examples/blog/test.sh index ed95a4b07..53be3d049 100755 --- a/examples/blog/test.sh +++ b/examples/blog/test.sh @@ -9,8 +9,8 @@ docker rm test-mongo-func docker run -p 27017:27017 --name test-mongo-func -d mongo -echo '{ "title": "My New Post", "body": "Hello world!", "user": "test" }' | docker run --rm -i -e METHOD=POST -e ROUTE=/posts -e CONFIG_DB=mongo:27017 --link test-mongo-func:mongo -e TEST=1 iron/func-blog -docker run --rm -i -e METHOD=GET -e ROUTE=/posts -e CONFIG_DB=mongo:27017 --link test-mongo-func:mongo -e TEST=1 iron/func-blog +echo '{ "title": "My New Post", "body": "Hello world!", "user": "test" }' | docker run --rm -i -e METHOD=POST -e ROUTE=/posts -e DB=mongo:27017 --link test-mongo-func:mongo -e TEST=1 iron/func-blog +docker run --rm -i -e METHOD=GET -e ROUTE=/posts -e DB=mongo:27017 --link test-mongo-func:mongo -e TEST=1 iron/func-blog docker stop test-mongo-func docker rm test-mongo-func \ No newline at end of file diff --git a/examples/checker/README.md b/examples/checker/README.md index 8c0caeab3..823f45060 100644 --- a/examples/checker/README.md +++ b/examples/checker/README.md @@ -74,5 +74,5 @@ curl -X POST --data '{ Now that we created our IronFunction route, let's test our new route ``` -curl -X POST --data '{ "env_vars": { "config_test": "1" } }' http://$FUNCAPI/r/checker/check +curl -X POST --data '{ "env_vars": { "test": "1" } }' http://$FUNCAPI/r/checker/check ``` \ No newline at end of file diff --git a/examples/redis/function.go b/examples/redis/function.go index e83717143..263607622 100644 --- a/examples/redis/function.go +++ b/examples/redis/function.go @@ -29,7 +29,7 @@ func main() { } // Dialing redis server - c, err := redis.Dial("tcp", os.Getenv("CONFIG_SERVER")) + c, err := redis.Dial("tcp", os.Getenv("SERVER")) if err != nil { log.Println("Failed to dial redis server") log.Fatal(err) @@ -37,8 +37,8 @@ func main() { } // Authenticate to redis server if exists the password - if os.Getenv("CONFIG_REDIS_AUTH") != "" { - if _, err := c.Do("AUTH", os.Getenv("CONFIG_REDIS_AUTH")); err != nil { + if os.Getenv("REDIS_AUTH") != "" { + if _, err := c.Do("AUTH", os.Getenv("REDIS_AUTH")); err != nil { log.Println("Failed to authenticate to redis server") log.Fatal(err) return @@ -46,16 +46,16 @@ func main() { } // Check if payload command is valid - if os.Getenv("CONFIG_COMMAND") != "GET" && os.Getenv("CONFIG_COMMAND") != "SET" { + if os.Getenv("COMMAND") != "GET" && os.Getenv("COMMAND") != "SET" { log.Println("Invalid command") return } // Execute command on redis server var r interface{} - if os.Getenv("CONFIG_COMMAND") == "GET" { + if os.Getenv("COMMAND") == "GET" { r, err = c.Do("GET", pl.Key) - } else if os.Getenv("CONFIG_COMMAND") == "SET" { + } else if os.Getenv("COMMAND") == "SET" { r, err = c.Do("SET", pl.Key, pl.Value) } diff --git a/examples/redis/test.sh b/examples/redis/test.sh index eee6486ac..5c497357a 100755 --- a/examples/redis/test.sh +++ b/examples/redis/test.sh @@ -14,8 +14,8 @@ docker rm test-redis-func docker run -p 6379:6379 --name test-redis-func -d redis -echo $PAYLOAD | docker run --rm -i -e CONFIG_SERVER=redis:6379 -e CONFIG_COMMAND=SET --link test-redis-func:redis iron/func-redis -echo $PAYLOAD | docker run --rm -i -e CONFIG_SERVER=redis:6379 -e CONFIG_COMMAND=GET --link test-redis-func:redis iron/func-redis +echo $PAYLOAD | docker run --rm -i -e SERVER=redis:6379 -e COMMAND=SET --link test-redis-func:redis iron/func-redis +echo $PAYLOAD | docker run --rm -i -e SERVER=redis:6379 -e COMMAND=GET --link test-redis-func:redis iron/func-redis docker stop test-redis-func docker rm test-redis-func \ No newline at end of file diff --git a/examples/twitter/function.go b/examples/twitter/function.go index d20a2e8da..cf8810643 100644 --- a/examples/twitter/function.go +++ b/examples/twitter/function.go @@ -36,8 +36,8 @@ func main() { fmt.Println("Looking for tweets of the account:", username) // Twitter auth config - config := oauth1.NewConfig(os.Getenv("CONFIG_CUSTOMER_KEY"), os.Getenv("CONFIG_CUSTOMER_SECRET")) - token := oauth1.NewToken(os.Getenv("CONFIG_ACCESS_TOKEN"), os.Getenv("CONFIG_ACCESS_SECRET")) + config := oauth1.NewConfig(os.Getenv("CUSTOMER_KEY"), os.Getenv("CUSTOMER_SECRET")) + token := oauth1.NewToken(os.Getenv("ACCESS_TOKEN"), os.Getenv("ACCESS_SECRET")) httpClient := config.Client(oauth1.NoContext, token) diff --git a/fnctl/README.md b/fnctl/README.md index 8ed903a02..ddc5fe5a4 100644 --- a/fnctl/README.md +++ b/fnctl/README.md @@ -6,7 +6,7 @@ Init will help you create a [function file](../docs/function-file.md) (func.yaml) in the current directory. -To make things simple, we try to use convention over configuration, so `init` will look for a file named `func.{language-extension}`. For example, +To make things simple, we try to use convention over configuration, so `init` will look for a file named `func.{language-extension}`. For example, if you are using Node, put the code that you want to execute in the file `func.js`. If you are using Python, use `func.py`. Ruby, use `func.rb`. Go, `func.go`. Etc. Run: @@ -21,7 +21,7 @@ If you want to override the convention with configuration, you can do that as we fnctl init [--runtime node] [--entrypoint "node hello.js"] / ``` -Or, if you want full control, just make a Dockerfile. If `init` finds a Dockerfile, it will use that instead of runtime and entrypoint. +Or, if you want full control, just make a Dockerfile. If `init` finds a Dockerfile, it will use that instead of runtime and entrypoint. ### Build, Bump, Run, Push @@ -92,7 +92,7 @@ fnctl apps create --config DB_URL=http://example.org/ otherapp ``` `--config` is a map of values passed to the route runtime in the form of -environment variables prefixed with `CONFIG_`. +environment variables. Repeated calls to `fnctl apps create` will trigger an update of the given route, thus you will be able to change any of these attributes later in time @@ -116,7 +116,7 @@ until the request is successfully completed, or `async`, in which the clients dispatches a new request, gets a task ID back and closes the HTTP connection. `--config` is a map of values passed to the route runtime in the form of -environment variables prefixed with `CONFIG_`. +environment variables. Repeated calls to `fnctl route create` will trigger an update of the given route, thus you will be able to change any of these attributes later in time