Skip to content

Commit

Permalink
Implement scaling ranges
Browse files Browse the repository at this point in the history
Scaling ranges keep the OpenFaaS CE gateway's requests to
within the intended bounds already implemented in other
components.

Signed-off-by: Alex Ellis (OpenFaaS Ltd) <[email protected]>
  • Loading branch information
alexellis committed Jun 7, 2023
1 parent e0144b0 commit 0061334
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 1 deletion.
2 changes: 1 addition & 1 deletion gateway/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ func main() {

prometheusQuery := metrics.NewPrometheusQuery(config.PrometheusHost, config.PrometheusPort, &http.Client{})
faasHandlers.ListFunctions = metrics.AddMetricsHandler(faasHandlers.ListFunctions, prometheusQuery)
faasHandlers.ScaleFunction = handlers.MakeForwardingProxyHandler(reverseProxy, forwardingNotifiers, urlResolver, nilURLTransformer, serviceAuthInjector)
faasHandlers.ScaleFunction = scaling.MakeHorizontalScalingHandler(handlers.MakeForwardingProxyHandler(reverseProxy, forwardingNotifiers, urlResolver, nilURLTransformer, serviceAuthInjector))

if credentials != nil {
faasHandlers.Alert =
Expand Down
49 changes: 49 additions & 0 deletions gateway/scaling/ranges.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
package scaling

import (
"bytes"
"encoding/json"
"io/ioutil"
"net/http"

"github.com/openfaas/faas-provider/types"
)

const (
// DefaultMinReplicas is the minimal amount of replicas for a service.
DefaultMinReplicas = 1
Expand All @@ -21,3 +30,43 @@ const (
// ScalingFactorLabel label indicates the scaling factor for a function
ScalingFactorLabel = "com.openfaas.scale.factor"
)

func MakeHorizontalScalingHandler(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Only POST is allowed", http.StatusMethodNotAllowed)
return
}

if r.Body == nil {
http.Error(w, "Error reading request body", http.StatusBadRequest)
return
}

body, err := ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, "Error reading request body", http.StatusBadRequest)
return
}

scaleRequest := types.ScaleServiceRequest{}
if err := json.Unmarshal(body, &scaleRequest); err != nil {
http.Error(w, "Error unmarshalling request body", http.StatusBadRequest)
return
}

if scaleRequest.Replicas < 1 {
scaleRequest.Replicas = 1
}

if scaleRequest.Replicas > DefaultMaxReplicas {
scaleRequest.Replicas = DefaultMaxReplicas
}

upstreamReq, _ := json.Marshal(scaleRequest)
// Restore the io.ReadCloser to its original state
r.Body = ioutil.NopCloser(bytes.NewBuffer(upstreamReq))

next.ServeHTTP(w, r)
}
}

0 comments on commit 0061334

Please sign in to comment.