diff --git a/pkg/storage/unified/resource/server.go b/pkg/storage/unified/resource/server.go index 20682323e72..4291d3c437e 100644 --- a/pkg/storage/unified/resource/server.go +++ b/pkg/storage/unified/resource/server.go @@ -32,8 +32,8 @@ var ( // ResourceServer implements all services type ResourceServer interface { ResourceStoreServer - // ResourceSearchServer - // DiagnosticsServer + ResourceSearchServer + DiagnosticsServer // Called once for initialization Init() error @@ -108,10 +108,10 @@ func NewResourceServer(opts ResourceServerOptions) (ResourceServer, error) { return nil, fmt.Errorf("missing AppendingStore implementation") } if opts.Search == nil { - return nil, fmt.Errorf("missing ResourceSearchServer implementation") + opts.Search = &NoopServer{} } if opts.Diagnostics == nil { - return nil, fmt.Errorf("missing Diagnostics implementation") + opts.Search = &NoopServer{} } return &server{ @@ -318,10 +318,22 @@ func (s *server) Create(ctx context.Context, req *CreateRequest) (*CreateRespons // Convert golang errors to status result errors that can be returned to a client func errToStatus(err error) (*StatusResult, error) { if err != nil { + apistatus, ok := err.(apierrors.APIStatus) + if ok { + s := apistatus.Status() + return &StatusResult{ + Status: s.Status, + Message: s.Message, + Reason: string(s.Reason), + Code: s.Code, + }, nil + } + // TODO... better conversion!!! return &StatusResult{ Status: "Failure", Message: err.Error(), + Code: 500, }, nil } return nil, err @@ -467,3 +479,37 @@ func (s *server) Watch(req *WatchRequest, srv ResourceStore_WatchServer) error { } return s.Watch(req, srv) } + +// GetBlob implements ResourceServer. +func (s *server) GetBlob(ctx context.Context, req *GetBlobRequest) (*GetBlobResponse, error) { + if err := s.Init(); err != nil { + return nil, err + } + rsp, err := s.search.GetBlob(ctx, req) + rsp.Status, err = errToStatus(err) + return rsp, err +} + +// History implements ResourceServer. +func (s *server) History(ctx context.Context, req *HistoryRequest) (*HistoryResponse, error) { + if err := s.Init(); err != nil { + return nil, err + } + return s.search.History(ctx, req) +} + +// IsHealthy implements ResourceServer. +func (s *server) IsHealthy(ctx context.Context, req *HealthCheckRequest) (*HealthCheckResponse, error) { + if err := s.Init(); err != nil { + return nil, err + } + return s.diagnostics.IsHealthy(ctx, req) +} + +// Origin implements ResourceServer. +func (s *server) Origin(ctx context.Context, req *OriginRequest) (*OriginResponse, error) { + if err := s.Init(); err != nil { + return nil, err + } + return s.search.Origin(ctx, req) +} diff --git a/pkg/storage/unified/resource/server_test.go b/pkg/storage/unified/resource/server_test.go index fac61211412..b4cecdc4591 100644 --- a/pkg/storage/unified/resource/server_test.go +++ b/pkg/storage/unified/resource/server_test.go @@ -97,11 +97,12 @@ func TestWriter(t *testing.T) { require.NoError(t, err) require.True(t, deleted.ResourceVersion > updated.ResourceVersion) - // We should get not found when trying to read the latest value + // We should get not found status when trying to read the latest value key.ResourceVersion = 0 found, err = server.Read(ctx, &ReadRequest{Key: key}) - require.Error(t, err) - require.Nil(t, found) + require.NoError(t, err) + require.NotNil(t, found.Status) + require.Equal(t, int32(404), found.Status.Code) }) }