diff --git a/pkg/registry/apis/query/client/plugin.go b/pkg/registry/apis/query/client/plugin.go index 7301f819be7..dcd9d84fa47 100644 --- a/pkg/registry/apis/query/client/plugin.go +++ b/pkg/registry/apis/query/client/plugin.go @@ -2,6 +2,7 @@ package client import ( "context" + "errors" "fmt" "net/http" "sync" @@ -44,6 +45,22 @@ type pluginRegistry struct { var _ clientapi.QueryDataClient = (*pluginClient)(nil) var _ query.DataSourceApiServerRegistry = (*pluginRegistry)(nil) +var k8sForbiddenError error = &apierrors.StatusError{ + ErrStatus: metav1.Status{ + Status: metav1.StatusFailure, + Code: http.StatusForbidden, + Message: "Access denied to the data source", + }, +} + +var k8sNotFoundError error = &apierrors.StatusError{ + ErrStatus: metav1.Status{ + Status: metav1.StatusFailure, + Code: http.StatusNotFound, + Message: "Data source not found", + }, +} + // NewQueryClientForPluginClient creates a client that delegates to the internal plugins.Client stack func NewQueryClientForPluginClient(p plugins.Client, ctx *plugincontext.Provider, accessControl accesscontrol.AccessControl) clientapi.QueryDataClient { return &pluginClient{ @@ -89,18 +106,18 @@ func (d *pluginClient) QueryData(ctx context.Context, req data.QueryDataRequest) } if !canQuery { - status := metav1.Status{ - Status: metav1.StatusFailure, - Code: http.StatusForbidden, - Message: "Access denied to the data source", - } - return nil, &apierrors.StatusError{ErrStatus: status} + return nil, k8sForbiddenError } // NOTE: this depends on uid unique across datasources settings, err := d.pCtxProvider.GetDataSourceInstanceSettings(ctx, dsRef.UID) if err != nil { - return nil, err + // there is no better way to differentiate between plugin-not-found and other-error + if errors.Is(err, datasources.ErrDataSourceNotFound) { + return nil, k8sNotFoundError + } else { + return nil, err + } } qdr := &backend.QueryDataRequest{