NFSSVC-27 Simplify ListBuckets handler

This commit is contained in:
Evgeniy Kulikov 2020-07-27 09:49:23 +03:00
parent e59d62237e
commit 1ca3e6e04b

View file

@ -43,7 +43,6 @@ type (
cnrInfoParams struct { cnrInfoParams struct {
cid refs.CID cid refs.CID
con *grpc.ClientConn
tkn *service.BearerTokenMsg tkn *service.BearerTokenMsg
} }
) )
@ -51,6 +50,7 @@ type (
func (h *handler) getContainerInfo(ctx context.Context, p cnrInfoParams) (*Bucket, error) { func (h *handler) getContainerInfo(ctx context.Context, p cnrInfoParams) (*Bucket, error) {
var ( var (
err error err error
con *grpc.ClientConn
res *container.GetResponse res *container.GetResponse
) )
@ -59,9 +59,11 @@ func (h *handler) getContainerInfo(ctx context.Context, p cnrInfoParams) (*Bucke
req.SetTTL(service.SingleForwardingTTL) req.SetTTL(service.SingleForwardingTTL)
req.SetBearer(p.tkn) req.SetBearer(p.tkn)
if err = service.SignRequestData(h.key, req); err != nil { if con, err = h.cli.GetConnection(ctx); err != nil {
return nil, errors.Wrap(err, "could not fetch connection")
} else if err = service.SignRequestData(h.key, req); err != nil {
return nil, errors.Wrap(err, "could not sign container info request") return nil, errors.Wrap(err, "could not sign container info request")
} else if res, err = container.NewServiceClient(p.con).Get(ctx, req); err != nil { } else if res, err = container.NewServiceClient(con).Get(ctx, req); err != nil {
return nil, errors.Wrap(err, "could not fetch container info") return nil, errors.Wrap(err, "could not fetch container info")
} }
@ -75,13 +77,34 @@ func (h *handler) getContainerInfo(ctx context.Context, p cnrInfoParams) (*Bucke
}, nil }, nil
} }
func (h *handler) getContainerList(ctx context.Context, tkn *service.BearerTokenMsg) ([]refs.CID, error) {
var (
err error
con *grpc.ClientConn
res *container.ListResponse
)
req := new(container.ListRequest)
req.OwnerID = tkn.OwnerID
req.SetTTL(service.SingleForwardingTTL)
req.SetBearer(tkn)
if con, err = h.cli.GetConnection(ctx); err != nil {
return nil, errors.Wrap(err, "could not fetch connection")
} else if err = service.SignRequestData(h.key, req); err != nil {
return nil, errors.Wrap(err, "could not sign request")
} else if res, err = container.NewServiceClient(con).List(ctx, req); err != nil {
return nil, errors.Wrap(err, "could not fetch list containers")
}
return res.CID, nil
}
func (h *handler) ListBucketsHandler(w http.ResponseWriter, r *http.Request) { func (h *handler) ListBucketsHandler(w http.ResponseWriter, r *http.Request) {
var ( var (
err error err error
uid = h.uid
inf *Bucket inf *Bucket
con *grpc.ClientConn lst []refs.CID
res *container.ListResponse
tkn *service.BearerTokenMsg tkn *service.BearerTokenMsg
) )
@ -102,43 +125,11 @@ func (h *handler) ListBucketsHandler(w http.ResponseWriter, r *http.Request) {
}, r.URL) }, r.URL)
return return
} } else if lst, err = h.getContainerList(ctx, tkn); err != nil {
h.log.Error("could not fetch bearer token",
req := new(container.ListRequest)
req.OwnerID = uid
req.SetTTL(service.SingleForwardingTTL)
req.SetBearer(tkn)
// req.SetVersion(APIVersion) ??
if con, err = h.cli.GetConnection(ctx); err != nil {
h.log.Error("could not get connection",
zap.Error(err)) zap.Error(err))
e := api.GetAPIError(api.ErrInternalError) // TODO check that error isn't gRPC error
api.WriteErrorResponse(ctx, w, api.Error{
Code: e.Code,
Description: err.Error(),
HTTPStatusCode: e.HTTPStatusCode,
}, r.URL)
return
} else if err = service.SignRequestData(h.key, req); err != nil {
h.log.Error("could not prepare request",
zap.Error(err))
e := api.GetAPIError(api.ErrInternalError)
api.WriteErrorResponse(ctx, w, api.Error{
Code: e.Code,
Description: err.Error(),
HTTPStatusCode: e.HTTPStatusCode,
}, r.URL)
return
} else if res, err = container.NewServiceClient(con).List(ctx, req); err != nil {
h.log.Error("could not list buckets",
zap.Error(err))
e := api.GetAPIError(api.ErrInternalError) e := api.GetAPIError(api.ErrInternalError)
@ -152,13 +143,13 @@ func (h *handler) ListBucketsHandler(w http.ResponseWriter, r *http.Request) {
} }
result := &ListBucketsResponse{Owner: Owner{ result := &ListBucketsResponse{Owner: Owner{
ID: uid.String(), ID: tkn.OwnerID.String(),
DisplayName: uid.String(), DisplayName: tkn.OwnerID.String(),
}} }}
params := cnrInfoParams{con: con, tkn: tkn} params := cnrInfoParams{tkn: tkn}
for _, cid := range res.CID { for _, cid := range lst {
// should receive each container info (??): // should receive each container info (??):
params.cid = cid params.cid = cid
@ -166,6 +157,8 @@ func (h *handler) ListBucketsHandler(w http.ResponseWriter, r *http.Request) {
h.log.Error("could not fetch bucket info", h.log.Error("could not fetch bucket info",
zap.Error(err)) zap.Error(err))
// TODO check that error isn't gRPC error
e := api.GetAPIError(api.ErrInternalError) e := api.GetAPIError(api.ErrInternalError)
api.WriteErrorResponse(ctx, w, api.Error{ api.WriteErrorResponse(ctx, w, api.Error{