mirror of https://github.com/grafana/grafana
Middleware: Add team metadata to HTTP handlers (#71010)
Signed-off-by: bergquist <carl.bergquist@gmail.com>pull/71777/head^2
parent
8ec4c1bdc8
commit
243b757168
@ -0,0 +1,40 @@ |
|||||||
|
package middleware |
||||||
|
|
||||||
|
import ( |
||||||
|
"net/http" |
||||||
|
"net/http/httptest" |
||||||
|
"testing" |
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/middleware/requestmeta" |
||||||
|
"github.com/grafana/grafana/pkg/web" |
||||||
|
"github.com/stretchr/testify/assert" |
||||||
|
) |
||||||
|
|
||||||
|
func TestRequestMetaDefault(t *testing.T) { |
||||||
|
m := web.New() |
||||||
|
m.Use(requestmeta.SetupRequestMetadata()) |
||||||
|
|
||||||
|
m.Get("/", func(rw http.ResponseWriter, req *http.Request) { |
||||||
|
v := requestmeta.GetRequestMetaData(req.Context()) |
||||||
|
assert.Equal(t, requestmeta.TeamCore, v.Team) |
||||||
|
}) |
||||||
|
|
||||||
|
req, _ := http.NewRequest(http.MethodGet, "/", nil) |
||||||
|
m.ServeHTTP(httptest.NewRecorder(), req) |
||||||
|
} |
||||||
|
|
||||||
|
func TestRequestMetaNewTeam(t *testing.T) { |
||||||
|
m := web.New() |
||||||
|
m.Use(requestmeta.SetupRequestMetadata()) |
||||||
|
|
||||||
|
m.Get("/", |
||||||
|
requestmeta.SetOwner(requestmeta.TeamAlerting), // set new owner for this route.
|
||||||
|
func(rw http.ResponseWriter, req *http.Request) { |
||||||
|
v := requestmeta.GetRequestMetaData(req.Context()) |
||||||
|
assert.Equal(t, requestmeta.TeamAlerting, v.Team) |
||||||
|
}) |
||||||
|
|
||||||
|
r, err := http.NewRequest(http.MethodGet, "/", nil) |
||||||
|
assert.NoError(t, err) |
||||||
|
m.ServeHTTP(httptest.NewRecorder(), r) |
||||||
|
} |
@ -0,0 +1,75 @@ |
|||||||
|
package requestmeta |
||||||
|
|
||||||
|
import ( |
||||||
|
"context" |
||||||
|
"net/http" |
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/web" |
||||||
|
) |
||||||
|
|
||||||
|
const ( |
||||||
|
TeamAlerting = "alerting" |
||||||
|
TeamAuth = "auth" |
||||||
|
TeamCore = "core" |
||||||
|
) |
||||||
|
|
||||||
|
type rMDContextKey struct{} |
||||||
|
|
||||||
|
type RequestMetaData struct { |
||||||
|
Team string |
||||||
|
} |
||||||
|
|
||||||
|
var requestMetaDataContextKey = rMDContextKey{} |
||||||
|
|
||||||
|
// SetupRequestMetadata injects defaul request metadata values
|
||||||
|
// on the request context.
|
||||||
|
func SetupRequestMetadata() web.Middleware { |
||||||
|
return func(next http.Handler) http.Handler { |
||||||
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
||||||
|
rmd := defaultRequestMetadata() |
||||||
|
|
||||||
|
ctx := context.WithValue(r.Context(), requestMetaDataContextKey, rmd) |
||||||
|
*r = *r.WithContext(ctx) |
||||||
|
|
||||||
|
next.ServeHTTP(w, r) |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// GetRequestMetaData returns the request metadata for the context.
|
||||||
|
// if request metadata is missing it will return the default values.
|
||||||
|
func GetRequestMetaData(ctx context.Context) *RequestMetaData { |
||||||
|
val := ctx.Value(requestMetaDataContextKey) |
||||||
|
|
||||||
|
value, ok := val.(*RequestMetaData) |
||||||
|
if ok { |
||||||
|
return value |
||||||
|
} |
||||||
|
|
||||||
|
return defaultRequestMetadata() |
||||||
|
} |
||||||
|
|
||||||
|
// SetRequestMetaData returns an `web.Handler` that overrides the request metadata
|
||||||
|
// with the provided param.
|
||||||
|
func SetRequestMetaData(rmd RequestMetaData) web.Handler { |
||||||
|
return func(w http.ResponseWriter, r *http.Request) { |
||||||
|
v := GetRequestMetaData(r.Context()) |
||||||
|
if rmd.Team != "" { |
||||||
|
v.Team = rmd.Team |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// SetOwner returns an `web.Handler` that sets the team name for an request.
|
||||||
|
func SetOwner(team string) web.Handler { |
||||||
|
return func(w http.ResponseWriter, r *http.Request) { |
||||||
|
v := GetRequestMetaData(r.Context()) |
||||||
|
v.Team = team |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func defaultRequestMetadata() *RequestMetaData { |
||||||
|
return &RequestMetaData{ |
||||||
|
Team: TeamCore, |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue