Adds extension points for runner pools in load-balanced mode (Patch 1/2) (#851)

* adds extension points for runner pools in load-balanced mode

* adds error to return values in RunnerPool and Runner interfaces
This commit is contained in:
Gerardo Viedma
2018-03-15 10:28:56 +00:00
committed by GitHub
parent 7df6863678
commit 6bc1220d8b
3 changed files with 41 additions and 0 deletions

31
api/models/runner_pool.go Normal file
View File

@@ -0,0 +1,31 @@
package models
import (
"context"
"io"
"net/http"
"time"
)
// RunnerPool is the abstraction for getting an ordered list of runners to try for a call
type RunnerPool interface {
Runners(call RunnerCall) ([]Runner, error)
Shutdown() error
}
// Runner is the interface to invoke the execution of a function call on a specific runner
type Runner interface {
TryExec(ctx context.Context, call RunnerCall) (bool, error)
Close() error
Address() string
}
// RunnerCall provides access to the necessary details of request in order for it to be
// processed by a RunnerPool
type RunnerCall interface {
SlotDeadline() time.Time
Request() *http.Request
ResponseWriter() io.Writer
StdErr() io.ReadWriteCloser
Model() *Call
}

View File

@@ -113,6 +113,7 @@ type Server struct {
rootMiddlewares []fnext.Middleware
apiMiddlewares []fnext.Middleware
promExporter *prometheus.Exporter
runnerPool models.RunnerPool
// Extensions can append to this list of contexts so that cancellations are properly handled.
extraCtxs []context.Context
}
@@ -842,6 +843,12 @@ func (s *Server) Datastore() models.Datastore {
return s.datastore
}
// WithRunnerPool provides an extension point for overriding
// the default runner pool implementation when running in load-balanced mode
func (s *Server) WithRunnerPool(runnerPool models.RunnerPool) {
s.runnerPool = runnerPool
}
// returns the unescaped ?cursor and ?perPage values
// pageParams clamps 0 < ?perPage <= 100 and defaults to 30 if 0
// ignores parsing errors and falls back to defaults.

View File

@@ -38,6 +38,9 @@ type ExtServer interface {
// AddRouteEndpoint adds an endpoints to /v1/apps/:app/routes/:route/x
AddRouteEndpointFunc(method, path string, handler func(w http.ResponseWriter, r *http.Request, app *models.App, route *models.Route))
// WithRunnerPool overrides the default runner pool implementation when running in load-balanced mode
WithRunnerPool(runnerPool models.RunnerPool)
// Datastore returns the Datastore Fn is using
Datastore() models.Datastore
}