Envtest based integration tests for Fission (#2858)
* skeleton for envtest fission * Refactor code and add CLI test * hack * Update server test * remove skip-ci for lint tests * Pass client go storagesvc * Add clientGen interface across code * Fix storagesvc test * Fix cmd client * add retry in server test * Fix concurrenct access to pool deployment * Remove old executor test * get rid of ginkgo/gomega * disable flaky test * flaky test * revert ci change * handle err from ParseBool --------- Signed-off-by: Sanket Sudake <sanketsudake@gmail.com> Co-authored-by: Pranoy Kundu <pranoy1998k@gmail.com>
This commit is contained in:
co-authored by
Pranoy Kundu
parent
15e16fcc82
commit
8a17d391c5
+12
-12
@@ -18,16 +18,16 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
malformedToken = errors.New("Unauthorized: malformed token")
|
||||
expiredToken = errors.New("Unauthorized: token is either expired or not active yet")
|
||||
invalidCreds = errors.New("Unauthorized: invalid username or password")
|
||||
errMalformedToken = errors.New("unauthorized: malformed token")
|
||||
errExpiredToken = errors.New("unauthorized: token is either expired or not active yet")
|
||||
errInvalidCreds = errors.New("unauthorized: invalid username or password")
|
||||
)
|
||||
|
||||
func checkAuthToken(r *http.Request) error {
|
||||
authHeader := strings.Split(r.Header.Get("Authorization"), "Bearer ")
|
||||
if len(authHeader) != 2 || len(authHeader[1]) == 0 {
|
||||
// malformed token
|
||||
return malformedToken
|
||||
return errMalformedToken
|
||||
}
|
||||
|
||||
jwtToken := authHeader[1]
|
||||
@@ -43,17 +43,17 @@ func checkAuthToken(r *http.Request) error {
|
||||
if ve, ok := err.(*jwt.ValidationError); ok {
|
||||
if ve.Errors&jwt.ValidationErrorMalformed != 0 {
|
||||
// malformed token
|
||||
err = malformedToken
|
||||
err = errMalformedToken
|
||||
} else if ve.Errors&(jwt.ValidationErrorExpired|jwt.ValidationErrorNotValidYet) != 0 {
|
||||
// token is either expired or not active yet
|
||||
err = expiredToken
|
||||
err = errExpiredToken
|
||||
} else {
|
||||
err = fmt.Errorf("Unauthorized: %w", err)
|
||||
err = fmt.Errorf("unauthorized: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
if err == nil {
|
||||
err = errors.New("Unauthorized: invalid token")
|
||||
err = errors.New("unauthorized: invalid token")
|
||||
}
|
||||
|
||||
return err
|
||||
@@ -83,17 +83,17 @@ type AuthConf struct {
|
||||
func parseAuthConf(auth *AuthConf) error {
|
||||
username, ok := os.LookupEnv("AUTH_USERNAME")
|
||||
if !ok || len(username) == 0 {
|
||||
return fmt.Errorf("Username not configured or invalid")
|
||||
return fmt.Errorf("username not configured or invalid")
|
||||
}
|
||||
|
||||
password, ok := os.LookupEnv("AUTH_PASSWORD")
|
||||
if !ok || len(password) == 0 {
|
||||
return fmt.Errorf("Password not configured or invalid")
|
||||
return fmt.Errorf("password not configured or invalid")
|
||||
}
|
||||
|
||||
signingKey, ok := os.LookupEnv("JWT_SIGNING_KEY")
|
||||
if !ok || len(signingKey) == 0 {
|
||||
return fmt.Errorf("Signing key not configured or invalid")
|
||||
return fmt.Errorf("signing key not configured or invalid")
|
||||
}
|
||||
|
||||
auth.username = username
|
||||
@@ -138,7 +138,7 @@ func authLoginHandler(featureConfig *config.FeatureConfig) func(w http.ResponseW
|
||||
rat := &fv1.RouterAuthToken{}
|
||||
|
||||
if t.Username != auth.username || t.Password != auth.password {
|
||||
http.Error(w, invalidCreds.Error(), http.StatusUnauthorized)
|
||||
http.Error(w, errInvalidCreds.Error(), http.StatusUnauthorized)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -101,7 +101,7 @@ func TestRouterAuth(t *testing.T) {
|
||||
{
|
||||
URL: "http://localhost:8990/test",
|
||||
StatusCode: http.StatusUnauthorized,
|
||||
Body: "Unauthorized: malformed token\n",
|
||||
Body: "unauthorized: malformed token\n",
|
||||
AuthReq: false,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -93,21 +93,26 @@ func makeHTTPTriggerSet(logger *zap.Logger, fmap *functionServiceMap, fissionCli
|
||||
return httpTriggerSet, nil
|
||||
}
|
||||
|
||||
func (ts *HTTPTriggerSet) subscribeRouter(ctx context.Context, mr *mutableRouter) {
|
||||
func (ts *HTTPTriggerSet) subscribeRouter(ctx context.Context, mr *mutableRouter) error {
|
||||
resolver := makeFunctionReferenceResolver(ts.logger, ts.funcInformer)
|
||||
ts.resolver = resolver
|
||||
ts.mutableRouter = mr
|
||||
|
||||
if ts.fissionClient == nil {
|
||||
// Used in tests only.
|
||||
mr.updateRouter(ts.getRouter(nil))
|
||||
router, err := ts.getRouter(nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
mr.updateRouter(router)
|
||||
ts.logger.Info("skipping continuous trigger updates")
|
||||
return
|
||||
return nil
|
||||
}
|
||||
go ts.updateRouter()
|
||||
go ts.syncTriggers()
|
||||
go ts.runInformer(ctx, ts.funcInformer)
|
||||
go ts.runInformer(ctx, ts.triggerInformer)
|
||||
return nil
|
||||
}
|
||||
|
||||
func defaultHomeHandler(w http.ResponseWriter, r *http.Request) {
|
||||
@@ -133,9 +138,12 @@ func versionHandler(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
}
|
||||
|
||||
func (ts *HTTPTriggerSet) getRouter(fnTimeoutMap map[types.UID]int) *mux.Router {
|
||||
func (ts *HTTPTriggerSet) getRouter(fnTimeoutMap map[types.UID]int) (*mux.Router, error) {
|
||||
|
||||
featureConfig, _ := config.GetFeatureConfig()
|
||||
featureConfig, err := config.GetFeatureConfig()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
muxRouter := mux.NewRouter()
|
||||
muxRouter.Use(metrics.HTTPMetricMiddleware)
|
||||
@@ -289,7 +297,7 @@ func (ts *HTTPTriggerSet) getRouter(fnTimeoutMap map[types.UID]int) *mux.Router
|
||||
// version of application.
|
||||
muxRouter.HandleFunc("/_version", versionHandler).Methods("GET")
|
||||
|
||||
return muxRouter
|
||||
return muxRouter, nil
|
||||
}
|
||||
|
||||
func (ts *HTTPTriggerSet) updateTriggerStatusFailed(ht *fv1.HTTPTrigger, err error) {
|
||||
@@ -408,6 +416,11 @@ func (ts *HTTPTriggerSet) updateRouter() {
|
||||
ts.functions = allfunctions
|
||||
|
||||
// make a new router and use it
|
||||
ts.mutableRouter.updateRouter(ts.getRouter(functionTimeout))
|
||||
router, err := ts.getRouter(functionTimeout)
|
||||
if err != nil {
|
||||
ts.logger.Error("error updating router", zap.Error(err))
|
||||
continue
|
||||
}
|
||||
ts.mutableRouter.updateRouter(router)
|
||||
}
|
||||
}
|
||||
|
||||
+19
-10
@@ -63,28 +63,38 @@ import (
|
||||
|
||||
// request url ---[trigger]---> Function(name, deployment) ----[deployment]----> Function(name, uid) ----[pool mgr]---> k8s service url
|
||||
|
||||
func router(ctx context.Context, logger *zap.Logger, httpTriggerSet *HTTPTriggerSet) *mutableRouter {
|
||||
func router(ctx context.Context, logger *zap.Logger, httpTriggerSet *HTTPTriggerSet) (*mutableRouter, error) {
|
||||
var mr *mutableRouter
|
||||
mux := mux.NewRouter()
|
||||
mux.Use(metrics.HTTPMetricMiddleware)
|
||||
|
||||
// see issue https://github.com/fission/fission/issues/1317
|
||||
useEncodedPath, _ := strconv.ParseBool(os.Getenv("USE_ENCODED_PATH"))
|
||||
useEncodedPath, err := strconv.ParseBool(os.Getenv("USE_ENCODED_PATH"))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if useEncodedPath {
|
||||
mr = newMutableRouter(logger, mux.UseEncodedPath())
|
||||
} else {
|
||||
mr = newMutableRouter(logger, mux)
|
||||
}
|
||||
|
||||
httpTriggerSet.subscribeRouter(ctx, mr)
|
||||
return mr
|
||||
err = httpTriggerSet.subscribeRouter(ctx, mr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return mr, nil
|
||||
}
|
||||
|
||||
func serve(ctx context.Context, logger *zap.Logger, port int,
|
||||
httpTriggerSet *HTTPTriggerSet, displayAccessLog bool) {
|
||||
mr := router(ctx, logger, httpTriggerSet)
|
||||
httpTriggerSet *HTTPTriggerSet, displayAccessLog bool) error {
|
||||
mr, err := router(ctx, logger, httpTriggerSet)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "error making router")
|
||||
}
|
||||
handler := otelUtils.GetHandlerWithOTEL(mr, "fission-router", otelUtils.UrlsToIgnore("/router-healthz"))
|
||||
httpserver.StartServer(ctx, logger, "router", fmt.Sprintf("%d", port), handler)
|
||||
go httpserver.StartServer(ctx, logger, "router", fmt.Sprintf("%d", port), handler)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Start starts a router
|
||||
@@ -198,7 +208,7 @@ func Start(ctx context.Context, clientGen crd.ClientGeneratorInterface, logger *
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "error making HTTP trigger set")
|
||||
}
|
||||
go metrics.ServeMetrics(ctx, logger)
|
||||
go metrics.ServeMetrics(ctx, "router", logger)
|
||||
|
||||
logger.Info("starting router", zap.Int("port", port))
|
||||
|
||||
@@ -206,6 +216,5 @@ func Start(ctx context.Context, clientGen crd.ClientGeneratorInterface, logger *
|
||||
ctx, span := tracer.Start(ctx, "router/Start")
|
||||
defer span.End()
|
||||
|
||||
go serve(ctx, logger, port, triggers, displayAccessLog)
|
||||
return nil
|
||||
return serve(ctx, logger, port, triggers, displayAccessLog)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user