diff --git a/pkg/services/authz/zanzana.go b/pkg/services/authz/zanzana.go index a1a48090c69..5533aa4a0d5 100644 --- a/pkg/services/authz/zanzana.go +++ b/pkg/services/authz/zanzana.go @@ -21,25 +21,23 @@ import ( "github.com/grafana/grafana/pkg/setting" ) -type ZanzanaClient interface{} - // ProvideZanzana used to register ZanzanaClient. // It will also start an embedded ZanzanaSever if mode is set to "embedded". -func ProvideZanzana(cfg *setting.Cfg, db db.DB, features featuremgmt.FeatureToggles) (ZanzanaClient, error) { +func ProvideZanzana(cfg *setting.Cfg, db db.DB, features featuremgmt.FeatureToggles) (zanzana.Client, error) { if !features.IsEnabledGlobally(featuremgmt.FlagZanzana) { return zanzana.NoopClient{}, nil } logger := log.New("zanzana") - var client *zanzana.Client + var client zanzana.Client switch cfg.Zanzana.Mode { case setting.ZanzanaModeClient: conn, err := grpc.NewClient(cfg.Zanzana.Addr, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { return nil, fmt.Errorf("failed to create zanzana client to remote server: %w", err) } - client = zanzana.NewClient(openfgav1.NewOpenFGAServiceClient(conn)) + client = zanzana.NewClient(conn) case setting.ZanzanaModeEmbedded: store, err := zanzana.NewEmbeddedStore(cfg, db, logger) if err != nil { @@ -53,7 +51,7 @@ func ProvideZanzana(cfg *setting.Cfg, db db.DB, features featuremgmt.FeatureTogg channel := &inprocgrpc.Channel{} openfgav1.RegisterOpenFGAServiceServer(channel, srv) - client = zanzana.NewClient(openfgav1.NewOpenFGAServiceClient(channel)) + client = zanzana.NewClient(channel) default: return nil, fmt.Errorf("unsupported zanzana mode: %s", cfg.Zanzana.Mode) } diff --git a/pkg/services/authz/zanzana/client.go b/pkg/services/authz/zanzana/client.go index e52a39a8be6..e7a093fd426 100644 --- a/pkg/services/authz/zanzana/client.go +++ b/pkg/services/authz/zanzana/client.go @@ -1,16 +1,46 @@ package zanzana import ( + "context" + openfgav1 "github.com/openfga/api/proto/openfga/v1" + "google.golang.org/grpc" + + "github.com/grafana/grafana/pkg/infra/log" ) -// FIXME(kalleep): Build out our wrapper client for openFGA -type Client struct { - c openfgav1.OpenFGAServiceClient +// Client is a wrapper around OpenFGAServiceClient with only methods using in Grafana included. +type Client interface { + Check(ctx context.Context, in *openfgav1.CheckRequest, opts ...grpc.CallOption) (*openfgav1.CheckResponse, error) + ListObjects(ctx context.Context, in *openfgav1.ListObjectsRequest, opts ...grpc.CallOption) (*openfgav1.ListObjectsResponse, error) } -func NewClient(c openfgav1.OpenFGAServiceClient) *Client { - return &Client{c} +type zanzanaClient struct { + client openfgav1.OpenFGAServiceClient + logger log.Logger +} + +func NewClient(cc grpc.ClientConnInterface) Client { + return &zanzanaClient{ + client: openfgav1.NewOpenFGAServiceClient(cc), + logger: log.New("zanzana-client"), + } +} + +func (c *zanzanaClient) Check(ctx context.Context, in *openfgav1.CheckRequest, opts ...grpc.CallOption) (*openfgav1.CheckResponse, error) { + return c.client.Check(ctx, in, opts...) +} + +func (c *zanzanaClient) ListObjects(ctx context.Context, in *openfgav1.ListObjectsRequest, opts ...grpc.CallOption) (*openfgav1.ListObjectsResponse, error) { + return c.client.ListObjects(ctx, in, opts...) } type NoopClient struct{} + +func (nc NoopClient) Check(ctx context.Context, in *openfgav1.CheckRequest, opts ...grpc.CallOption) (*openfgav1.CheckResponse, error) { + return nil, nil +} + +func (nc NoopClient) ListObjects(ctx context.Context, in *openfgav1.ListObjectsRequest, opts ...grpc.CallOption) (*openfgav1.ListObjectsResponse, error) { + return nil, nil +}