Skip to content
Snippets Groups Projects
Commit 457d0be7 authored by leigh schrandt's avatar leigh schrandt Committed by Alex Ellis
Browse files

Add GatewayConfig

Add env configurable readTimeout / writeTimeout
Add env-timeout test
Modify appropriate Dockerfiles

Signed-off-by: default avatarleigh schrandt <leigh@null.net>
parent a9774a9c
No related branches found
No related tags found
No related merge requests found
......@@ -10,13 +10,16 @@ FROM golang:1.7.5
WORKDIR /go/src/github.com/alexellis/faas/gateway
COPY vendor vendor
COPY vendor vendor
COPY handlers handlers
COPY metrics metrics
COPY requests requests
COPY tests tests
COPY server.go .
COPY handlers handlers
COPY metrics metrics
COPY requests requests
COPY tests tests
COPY server.go .
COPY readconfig.go .
COPY config_test.go .
RUN go test -v ./tests && \
RUN go test && \
go test -v ./tests && \
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
......@@ -10,12 +10,15 @@ RUN go get -d github.com/Sirupsen/logrus
WORKDIR /go/src/github.com/alexellis/faas/gateway
COPY metrics metrics
COPY requests requests
COPY tests tests
COPY handlers handlers
COPY metrics metrics
COPY requests requests
COPY tests tests
COPY handlers handlers
COPY server.go .
COPY server.go .
COPY readconfig.go .
COPY config_test.go .
RUN go test -v ./tests && \
RUN go test && \
go test -v ./tests && \
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM golang:1.7.5
WORKDIR /go/src/github.com/alexellis/faas/gateway
COPY vendor vendor
COPY handlers handlers
COPY metrics metrics
COPY requests requests
COPY tests tests
COPY server.go .
COPY vendor vendor
COPY handlers handlers
COPY metrics metrics
COPY requests requests
COPY tests tests
COPY server.go .
COPY readconfig.go .
COPY config_test.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gateway .
......
......@@ -2,13 +2,15 @@ FROM golang:1.7.5
# RUN mkdir -p /go/src/github.com/alexellis/faas/gateway
WORKDIR /go/src/github.com/alexellis/faas/gateway
COPY vendor vendor
COPY vendor vendor
COPY handlers handlers
COPY metrics metrics
COPY requests requests
COPY tests tests
COPY server.go .
COPY handlers handlers
COPY metrics metrics
COPY requests requests
COPY tests tests
COPY server.go .
COPY readconfig.go .
COPY config_test.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gateway .
// Copyright (c) Alex Ellis 2017. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
package main
import (
"testing"
"time"
)
type EnvBucket struct {
Items map[string]string
}
func NewEnvBucket() EnvBucket {
return EnvBucket{
Items: make(map[string]string),
}
}
func (e EnvBucket) Getenv(key string) string {
return e.Items[key]
}
func (e EnvBucket) Setenv(key string, value string) {
e.Items[key] = value
}
func TestRead_EmptyTimeoutConfig(t *testing.T) {
defaults := NewEnvBucket()
readConfig := ReadConfig{}
config := readConfig.Read(defaults)
if (config.readTimeout) != time.Duration(8)*time.Second {
t.Log("readTimeout incorrect")
t.Fail()
}
if (config.writeTimeout) != time.Duration(8)*time.Second {
t.Log("writeTimeout incorrect")
t.Fail()
}
}
func TestRead_ReadAndWriteTimeoutConfig(t *testing.T) {
defaults := NewEnvBucket()
defaults.Setenv("read_timeout", "10")
defaults.Setenv("write_timeout", "60")
readConfig := ReadConfig{}
config := readConfig.Read(defaults)
if (config.readTimeout) != time.Duration(10)*time.Second {
t.Logf("readTimeout incorrect, got: %d\n", config.readTimeout)
t.Fail()
}
if (config.writeTimeout) != time.Duration(60)*time.Second {
t.Logf("writeTimeout incorrect, got: %d\n", config.writeTimeout)
t.Fail()
}
}
package main
import (
"os"
"strconv"
"time"
)
// OsEnv implements interface to wrap os.Getenv
type OsEnv struct {
}
// Getenv wraps os.Getenv
func (OsEnv) Getenv(key string) string {
return os.Getenv(key)
}
// HasEnv provides interface for os.Getenv
type HasEnv interface {
Getenv(key string) string
}
// ReadConfig constitutes config from env variables
type ReadConfig struct {
}
func parseBoolValue(val string) bool {
if val == "true" {
return true
}
return false
}
func parseIntValue(val string, fallback int) int {
if len(val) > 0 {
parsedVal, parseErr := strconv.Atoi(val)
if parseErr == nil && parsedVal >= 0 {
return parsedVal
}
}
return fallback
}
// Read fetches config from environmental variables.
func (ReadConfig) Read(hasEnv HasEnv) GatewayConfig {
cfg := GatewayConfig{}
readTimeout := parseIntValue(hasEnv.Getenv("read_timeout"), 8)
writeTimeout := parseIntValue(hasEnv.Getenv("write_timeout"), 8)
cfg.readTimeout = time.Duration(readTimeout) * time.Second
cfg.writeTimeout = time.Duration(writeTimeout) * time.Second
return cfg
}
// GatewayConfig for the process.
type GatewayConfig struct {
readTimeout time.Duration
writeTimeout time.Duration
}
......@@ -4,7 +4,6 @@ import (
"context"
"log"
"net/http"
"time"
"github.com/Sirupsen/logrus"
faasHandlers "github.com/alexellis/faas/gateway/handlers"
......@@ -20,6 +19,13 @@ func main() {
logger := logrus.Logger{}
logrus.SetFormatter(&logrus.TextFormatter{})
osEnv := OsEnv{}
readConfig := ReadConfig{}
config := readConfig.Read(osEnv)
log.Printf("HTTP Read Timeout: %s", config.readTimeout)
log.Printf("HTTP Write Timeout: %s", config.writeTimeout)
var dockerClient *client.Client
var err error
dockerClient, err = client.NewEnvClient()
......@@ -30,7 +36,7 @@ func main() {
if err != nil {
log.Fatal("Error with Docker server.\n", err)
}
log.Printf("API version: %s, %s\n", dockerVersion.APIVersion, dockerVersion.Version)
log.Printf("Docker API version: %s, %s\n", dockerVersion.APIVersion, dockerVersion.Version)
metricsOptions := metrics.BuildMetricsOptions()
metrics.RegisterMetrics(metricsOptions)
......@@ -61,14 +67,12 @@ func main() {
r.Handle("/", http.RedirectHandler("/ui/", http.StatusMovedPermanently)).Methods("GET")
readTimeout := 8 * time.Second
writeTimeout := 8 * time.Second
tcpPort := 8080
s := &http.Server{
Addr: fmt.Sprintf(":%d", tcpPort),
ReadTimeout: readTimeout,
WriteTimeout: writeTimeout,
ReadTimeout: config.readTimeout,
WriteTimeout: config.writeTimeout,
MaxHeaderBytes: http.DefaultMaxHeaderBytes, // 1MB - can be overridden by setting Server.MaxHeaderBytes.
Handler: r,
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment