From c10462cdc5f1e12dee88fafed3144fd1dcbf5341 Mon Sep 17 00:00:00 2001 From: Reed Allman Date: Wed, 6 Sep 2017 02:50:57 -0700 Subject: [PATCH] FN_MEMORY, FN_TYPE and precedence for app/route vars --- api/agent/agent_test.go | 40 +++++++++++++++++++++++----------------- api/agent/call.go | 15 ++++++++++----- 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/api/agent/agent_test.go b/api/agent/agent_test.go index 30b08600c..c6117eddb 100644 --- a/api/agent/agent_test.go +++ b/api/agent/agent_test.go @@ -22,6 +22,8 @@ func TestCallConfigurationRequest(t *testing.T) { const timeout = 1 const idleTimeout = 20 const memory = 256 + typ := "sync" + format := "default" cfg := models.Config{"APP_VAR": "FOO"} rCfg := models.Config{"ROUTE_VAR": "BAR"} @@ -36,8 +38,8 @@ func TestCallConfigurationRequest(t *testing.T) { Path: path, AppName: appName, Image: image, - Type: "sync", - Format: "default", + Type: typ, + Format: format, Timeout: timeout, IdleTimeout: idleTimeout, Memory: memory, @@ -112,12 +114,13 @@ func TestCallConfigurationRequest(t *testing.T) { } expectedBase := map[string]string{ - "FN_FORMAT": "default", - "FN_APP_NAME": appName, - "FN_ROUTE": path, - "FN_MEMORY_MB": strconv.Itoa(memory), - "APP_VAR": "FOO", - "ROUTE_VAR": "BAR", + "FN_FORMAT": format, + "FN_APP_NAME": appName, + "FN_ROUTE": path, + "FN_MEMORY": strconv.Itoa(memory), + "FN_TYPE": typ, + "APP_VAR": "FOO", + "ROUTE_VAR": "BAR", } expectedEnv := make(map[string]string) @@ -199,14 +202,17 @@ func TestCallConfigurationModel(t *testing.T) { method := "GET" url := "http://127.0.0.1:8080/r/" + appName + path payload := "payload" + typ := "sync" + format := "default" env := map[string]string{ - "FN_FORMAT": "default", - "FN_APP_NAME": appName, - "FN_ROUTE": path, - "FN_MEMORY_MB": strconv.Itoa(memory), - "APP_VAR": "FOO", - "ROUTE_VAR": "BAR", - "DOUBLE_VAR": "BIZ, BAZ", + "FN_FORMAT": format, + "FN_APP_NAME": appName, + "FN_ROUTE": path, + "FN_MEMORY": strconv.Itoa(memory), + "FN_TYPE": typ, + "APP_VAR": "FOO", + "ROUTE_VAR": "BAR", + "DOUBLE_VAR": "BIZ, BAZ", } cm := &models.Call{ @@ -215,8 +221,8 @@ func TestCallConfigurationModel(t *testing.T) { AppName: appName, Path: path, Image: image, - Type: "sync", - Format: "default", + Type: typ, + Format: format, Timeout: timeout, IdleTimeout: idleTimeout, Memory: memory, diff --git a/api/agent/call.go b/api/agent/call.go index f34f7c4a0..d864d12ae 100644 --- a/api/agent/call.go +++ b/api/agent/call.go @@ -65,12 +65,8 @@ func FromRequest(appName, path string, req *http.Request) CallOpt { // baseVars are the vars on the route & app, not on this specific request [for hot functions] baseVars := make(map[string]string, len(app.Config)+len(route.Config)+3) - baseVars["FN_FORMAT"] = route.Format - baseVars["FN_APP_NAME"] = appName - baseVars["FN_ROUTE"] = route.Path - baseVars["FN_MEMORY_MB"] = fmt.Sprintf("%d", route.Memory) - // app config + // add app & route config before our standard additions for k, v := range app.Config { k = toEnvName("", k) baseVars[k] = v @@ -80,6 +76,12 @@ func FromRequest(appName, path string, req *http.Request) CallOpt { baseVars[k] = v } + baseVars["FN_FORMAT"] = route.Format + baseVars["FN_APP_NAME"] = appName + baseVars["FN_ROUTE"] = route.Path + baseVars["FN_MEMORY"] = fmt.Sprintf("%d", route.Memory) + baseVars["FN_TYPE"] = route.Type + // envVars contains the full set of env vars, per request + base envVars := make(map[string]string, len(baseVars)+len(params)+len(req.Header)+3) @@ -169,6 +171,9 @@ func FromRequest(appName, path string, req *http.Request) CallOpt { } } +// TODO this currently relies on FromRequest having happened before to create the model +// here, to be a fully qualified model. We probably should double check but having a way +// to bypass will likely be what's used anyway unless forced. func FromModel(mCall *models.Call) CallOpt { return func(a *agent, c *call) error { c.Call = mCall