Index: appengine/logdog/coordinator/endpoints/logs/service.go |
diff --git a/appengine/logdog/coordinator/endpoints/logs/service.go b/appengine/logdog/coordinator/endpoints/logs/service.go |
index 88f43c05d9a45f4124269be0727b9234bb204388..cda99e29400f4badf6787c95f4d098db711aea2f 100644 |
--- a/appengine/logdog/coordinator/endpoints/logs/service.go |
+++ b/appengine/logdog/coordinator/endpoints/logs/service.go |
@@ -6,7 +6,12 @@ package logs |
import ( |
"github.com/golang/protobuf/proto" |
+ "github.com/luci/luci-go/appengine/logdog/coordinator" |
+ "github.com/luci/luci-go/appengine/logdog/coordinator/endpoints" |
"github.com/luci/luci-go/common/api/logdog_coordinator/logs/v1" |
+ "github.com/luci/luci-go/common/config" |
+ "github.com/luci/luci-go/common/grpcutil" |
+ log "github.com/luci/luci-go/common/logging" |
"golang.org/x/net/context" |
) |
@@ -28,6 +33,22 @@ func newService(svr *server) logdog.LogsServer { |
return &logdog.DecoratedLogs{ |
Service: svr, |
Prelude: func(c context.Context, methodName string, req proto.Message) (context.Context, error) { |
+ // Enter a datastore namespace based on the message type. |
+ // |
+ // We use a type switch here because this is a shared decorator. All user |
+ // mesages must implement ProjectBoundMessage. |
+ pbm, ok := req.(endpoints.ProjectBoundMessage) |
+ if !ok { |
+ log.Fields{ |
+ "methodName": methodName, |
+ }.Errorf(c, "Request (%T) does not expose a project namespace.", req) |
+ return nil, grpcutil.Internal |
+ } |
+ |
+ if err := coordinator.WithProjectNamespace(&c, config.ProjectName(pbm.GetMessageProject())); err != nil { |
+ return nil, grpcutil.Internal |
+ } |
+ |
return c, nil |
}, |
} |