Enable prefix based routing (#2047)

* Enable prefix based routing

Signed-off-by: Harsh Thakur <harshthakur9030@gmail.com>

* Optimize checking condition

Signed-off-by: Sanket Sudake <sanketsudake@gmail.com>

* Disable few tests

* disable router modification for now

* run code generator

* Collect fission dump in CI

* Enable all tests back

Signed-off-by: Sanket Sudake <sanketsudake@gmail.com>

* Remove unwanted code

Signed-off-by: Sanket Sudake <sanketsudake@gmail.com>

* Add prefix support at more places and couple of todo's

Signed-off-by: Sanket Sudake <sanketsudake@gmail.com>

* Few more changes

Signed-off-by: Sanket Sudake <sanketsudake@gmail.com>

* Improve function trim support

* Support for prefix based urls in fission function test

Signed-off-by: Sanket Sudake <sanketsudake@gmail.com>

* multi route for fission function test

Signed-off-by: Sanket Sudake <sanketsudake@gmail.com>

* Improve validations in trigger creations

* Adjust leading / in url from fission

Signed-off-by: Sanket Sudake <sanketsudake@gmail.com>

* Change suburl to subpath for function test

Signed-off-by: Sanket Sudake <sanketsudake@gmail.com>

Co-authored-by: Sanket Sudake <sanketsudake@gmail.com>
This commit is contained in:
Harsh Thakur
2021-06-10 13:54:49 +05:30
committed by GitHub
co-authored by Sanket Sudake
parent f01de5c802
commit aa45703a99
20 changed files with 149 additions and 44 deletions
+27 -7
View File
@@ -27,6 +27,7 @@ import (
"net/http"
"net/http/httputil"
"net/url"
"strings"
"time"
"github.com/pkg/errors"
@@ -39,6 +40,7 @@ import (
"github.com/fission/fission/pkg/error/network"
executorClient "github.com/fission/fission/pkg/executor/client"
"github.com/fission/fission/pkg/throttler"
"github.com/fission/fission/pkg/utils"
)
const (
@@ -220,12 +222,26 @@ func (roundTripper *RetryingRoundTripper) RoundTrip(req *http.Request) (*http.Re
req.URL.Scheme = roundTripper.serviceURL.Scheme
req.URL.Host = roundTripper.serviceURL.Host
// To keep the function run container simple, it
// doesn't do any routing. In the future if we have
// multiple functions per container, we could use the
// function metadata here.
// leave the query string intact (req.URL.RawQuery)
req.URL.Path = "/"
// With addition of routing support from functions if function supports routing,
// 1. we trim prefix url and forward request
// 2. otherwise we just keep default request to root path
// We leave the query string intact (req.URL.RawQuery) where as we manipuate
// req.URL.Path according to httpTrigger specification.
prefixTrim := ""
functionURL := utils.UrlForFunction(fnMeta.Name, fnMeta.Namespace)
if roundTripper.funcHandler.httpTrigger != nil && roundTripper.funcHandler.httpTrigger.Spec.Prefix != nil && *roundTripper.funcHandler.httpTrigger.Spec.Prefix != "" {
prefixTrim = *roundTripper.funcHandler.httpTrigger.Spec.Prefix
} else if strings.HasPrefix(req.URL.Path, functionURL) {
prefixTrim = functionURL
}
if prefixTrim != "" {
req.URL.Path = strings.TrimPrefix(req.URL.Path, prefixTrim)
if !strings.HasPrefix(req.URL.Path, "/") {
req.URL.Path = "/" + req.URL.Path
}
} else {
req.URL.Path = "/"
}
// Overwrite request host with internal host,
// or request will be blocked in some situations
@@ -608,7 +624,11 @@ func (fh functionHandler) collectFunctionMetric(start time.Time, rrt *RetryingRo
}
if fh.httpTrigger != nil {
httpMetricLabels.host = fh.httpTrigger.Spec.Host
httpMetricLabels.path = fh.httpTrigger.Spec.RelativeURL
if fh.httpTrigger.Spec.Prefix != nil && *fh.httpTrigger.Spec.Prefix != "" {
httpMetricLabels.path = *fh.httpTrigger.Spec.Prefix
} else {
httpMetricLabels.path = fh.httpTrigger.Spec.RelativeURL
}
}
// Track metrics
+8 -3
View File
@@ -166,13 +166,18 @@ func (ts *HTTPTriggerSet) getRouter(fnTimeoutMap map[types.UID]int) *mux.Router
fh.function = fn
}
}
var ht *mux.Route
ht := muxRouter.HandleFunc(trigger.Spec.RelativeURL, fh.handler)
if trigger.Spec.Prefix != nil && *trigger.Spec.Prefix != "" {
ht = muxRouter.PathPrefix(*trigger.Spec.Prefix).HandlerFunc(fh.handler)
} else {
ht = muxRouter.HandleFunc(trigger.Spec.RelativeURL, fh.handler)
}
ht.Methods(trigger.Spec.Method)
if trigger.Spec.Host != "" {
ht.Host(trigger.Spec.Host)
}
if trigger.Spec.RelativeURL == "/" && trigger.Spec.Method == "GET" {
if trigger.Spec.Prefix == nil && trigger.Spec.RelativeURL == "/" && trigger.Spec.Method == "GET" {
homeHandled = true
}
}
@@ -202,7 +207,7 @@ func (ts *HTTPTriggerSet) getRouter(fnTimeoutMap map[types.UID]int) *mux.Router
functionTimeoutMap: fnTimeoutMap,
unTapServiceTimeout: ts.unTapServiceTimeout,
}
muxRouter.HandleFunc(utils.UrlForFunction(fn.ObjectMeta.Name, fn.ObjectMeta.Namespace), fh.handler)
muxRouter.PathPrefix(utils.UrlForFunction(fn.ObjectMeta.Name, fn.ObjectMeta.Namespace)).HandlerFunc(fh.handler)
}
// Healthz endpoint for the router.
+3
View File
@@ -27,6 +27,9 @@ import (
func GetIngressSpec(namespace string, trigger *fv1.HTTPTrigger) *v1beta1.Ingress {
// TODO: remove backward compatibility
host, path := trigger.Spec.Host, trigger.Spec.RelativeURL
if trigger.Spec.Prefix != nil && *trigger.Spec.Prefix != "" {
path = *trigger.Spec.Prefix
}
if len(trigger.Spec.IngressConfig.Host) > 0 && len(trigger.Spec.IngressConfig.Path) > 0 {
host, path = trigger.Spec.IngressConfig.Host, trigger.Spec.IngressConfig.Path
}