apigen: endpoint to get all buckets usage by project ID
Added new endpoint to get all bucket rollups by bucket ID. Example of response: vitalii:~/Documents$ ./testapi.sh HTTP/1.1 200 OK Content-Type: application/json Date: Mon, 07 Mar 2022 11:18:55 GMT Content-Length: 671 [{"projectID":"a9b2b1b6-714a-4c49-99f1-6a53d0852525","bucketName":"demo-bucket","totalStoredData":0.0026272243089674662,"totalSegments":0.05000107166666666,"objectCount":0.03333373083333333,"metadataSize":1.6750359008333334e-9,"repairEgress":0,"getEgress":0,"auditEgress":0,"since":"2022-03-01T11:00:00Z","before":"2022-03-07T11:17:07Z"},{"projectID":"a9b2b1b6-714a-4c49-99f1-6a53d0852525","bucketName":"qwe","totalStoredData":0.000018436725422435552,"totalSegments":0.016667081388888887,"objectCount":0.016667081388888887,"metadataSize":1.933381441111111e-9,"repairEgress":0,"getEgress":0,"auditEgress":0,"since":"2022-03-01T11:00:00Z","before":"2022-03-07T11:17:07Z"}] Change-Id: I8b04b24dbc67b78be5c309ce542bf03d6f67e65d
This commit is contained in:
parent
ca09a06680
commit
2ccfd13d7f
@ -25,6 +25,7 @@ var ErrProjectsAPI = errs.Class("consoleapi projects api")
|
|||||||
type ProjectManagementService interface {
|
type ProjectManagementService interface {
|
||||||
GenGetUsersProjects(context.Context) ([]console.Project, api.HTTPError)
|
GenGetUsersProjects(context.Context) ([]console.Project, api.HTTPError)
|
||||||
GenGetSingleBucketUsageRollup(context.Context, uuid.UUID, string, time.Time, time.Time) (*accounting.BucketUsageRollup, api.HTTPError)
|
GenGetSingleBucketUsageRollup(context.Context, uuid.UUID, string, time.Time, time.Time) (*accounting.BucketUsageRollup, api.HTTPError)
|
||||||
|
GenGetBucketUsageRollups(context.Context, uuid.UUID, time.Time, time.Time) ([]accounting.BucketUsageRollup, api.HTTPError)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handler is an api handler that exposes all projects related functionality.
|
// Handler is an api handler that exposes all projects related functionality.
|
||||||
@ -44,35 +45,11 @@ func NewProjectManagement(log *zap.Logger, service ProjectManagementService, rou
|
|||||||
projectsRouter := router.PathPrefix("/api/v0/projects").Subrouter()
|
projectsRouter := router.PathPrefix("/api/v0/projects").Subrouter()
|
||||||
projectsRouter.HandleFunc("/", handler.handleGenGetUsersProjects).Methods("GET")
|
projectsRouter.HandleFunc("/", handler.handleGenGetUsersProjects).Methods("GET")
|
||||||
projectsRouter.HandleFunc("/bucket-rollup", handler.handleGenGetSingleBucketUsageRollup).Methods("GET")
|
projectsRouter.HandleFunc("/bucket-rollup", handler.handleGenGetSingleBucketUsageRollup).Methods("GET")
|
||||||
|
projectsRouter.HandleFunc("/bucket-rollups", handler.handleGenGetBucketUsageRollups).Methods("GET")
|
||||||
|
|
||||||
return handler
|
return handler
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handler) handleGenGetUsersProjects(w http.ResponseWriter, r *http.Request) {
|
|
||||||
ctx := r.Context()
|
|
||||||
var err error
|
|
||||||
defer mon.Task()(&ctx)(&err)
|
|
||||||
|
|
||||||
w.Header().Set("Content-Type", "application/json")
|
|
||||||
|
|
||||||
ctx, err = h.auth.IsAuthenticated(ctx, r)
|
|
||||||
if err != nil {
|
|
||||||
api.ServeError(h.log, w, http.StatusUnauthorized, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
retVal, httpErr := h.service.GenGetUsersProjects(ctx)
|
|
||||||
if httpErr.Err != nil {
|
|
||||||
api.ServeError(h.log, w, httpErr.Status, httpErr.Err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.NewEncoder(w).Encode(retVal)
|
|
||||||
if err != nil {
|
|
||||||
h.log.Debug("failed to write json GenGetUsersProjects response", zap.Error(ErrProjectsAPI.Wrap(err)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *Handler) handleGenGetSingleBucketUsageRollup(w http.ResponseWriter, r *http.Request) {
|
func (h *Handler) handleGenGetSingleBucketUsageRollup(w http.ResponseWriter, r *http.Request) {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
var err error
|
var err error
|
||||||
@ -125,3 +102,75 @@ func (h *Handler) handleGenGetSingleBucketUsageRollup(w http.ResponseWriter, r *
|
|||||||
h.log.Debug("failed to write json GenGetSingleBucketUsageRollup response", zap.Error(ErrProjectsAPI.Wrap(err)))
|
h.log.Debug("failed to write json GenGetSingleBucketUsageRollup response", zap.Error(ErrProjectsAPI.Wrap(err)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *Handler) handleGenGetBucketUsageRollups(w http.ResponseWriter, r *http.Request) {
|
||||||
|
ctx := r.Context()
|
||||||
|
var err error
|
||||||
|
defer mon.Task()(&ctx)(&err)
|
||||||
|
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
|
||||||
|
ctx, err = h.auth.IsAuthenticated(ctx, r)
|
||||||
|
if err != nil {
|
||||||
|
api.ServeError(h.log, w, http.StatusUnauthorized, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
projectID, err := uuid.FromString(r.URL.Query().Get("projectID"))
|
||||||
|
if err != nil {
|
||||||
|
api.ServeError(h.log, w, http.StatusBadRequest, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
sinceStamp, err := strconv.ParseInt(r.URL.Query().Get("since"), 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
api.ServeError(h.log, w, http.StatusBadRequest, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
since := time.Unix(sinceStamp, 0).UTC()
|
||||||
|
|
||||||
|
beforeStamp, err := strconv.ParseInt(r.URL.Query().Get("before"), 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
api.ServeError(h.log, w, http.StatusBadRequest, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
before := time.Unix(beforeStamp, 0).UTC()
|
||||||
|
|
||||||
|
retVal, httpErr := h.service.GenGetBucketUsageRollups(ctx, projectID, since, before)
|
||||||
|
if httpErr.Err != nil {
|
||||||
|
api.ServeError(h.log, w, httpErr.Status, httpErr.Err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = json.NewEncoder(w).Encode(retVal)
|
||||||
|
if err != nil {
|
||||||
|
h.log.Debug("failed to write json GenGetBucketUsageRollups response", zap.Error(ErrProjectsAPI.Wrap(err)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *Handler) handleGenGetUsersProjects(w http.ResponseWriter, r *http.Request) {
|
||||||
|
ctx := r.Context()
|
||||||
|
var err error
|
||||||
|
defer mon.Task()(&ctx)(&err)
|
||||||
|
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
|
||||||
|
ctx, err = h.auth.IsAuthenticated(ctx, r)
|
||||||
|
if err != nil {
|
||||||
|
api.ServeError(h.log, w, http.StatusUnauthorized, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
retVal, httpErr := h.service.GenGetUsersProjects(ctx)
|
||||||
|
if httpErr.Err != nil {
|
||||||
|
api.ServeError(h.log, w, httpErr.Status, httpErr.Err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = json.NewEncoder(w).Encode(retVal)
|
||||||
|
if err != nil {
|
||||||
|
h.log.Debug("failed to write json GenGetUsersProjects response", zap.Error(ErrProjectsAPI.Wrap(err)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -32,8 +32,8 @@ func main() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
g.Get("/bucket-rollup", &apigen.Endpoint{
|
g.Get("/bucket-rollup", &apigen.Endpoint{
|
||||||
Name: "Get Project's Bucket Usage",
|
Name: "Get Project's Single Bucket Usage",
|
||||||
Description: "Gets project's bucket usage by bucket ID",
|
Description: "Gets project's single bucket usage by bucket ID",
|
||||||
MethodName: "GenGetSingleBucketUsageRollup",
|
MethodName: "GenGetSingleBucketUsageRollup",
|
||||||
Response: &accounting.BucketUsageRollup{},
|
Response: &accounting.BucketUsageRollup{},
|
||||||
Params: []apigen.Param{
|
Params: []apigen.Param{
|
||||||
@ -43,6 +43,18 @@ func main() {
|
|||||||
apigen.NewParam("before", time.Time{}),
|
apigen.NewParam("before", time.Time{}),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
g.Get("/bucket-rollups", &apigen.Endpoint{
|
||||||
|
Name: "Get Project's All Buckets Usage",
|
||||||
|
Description: "Gets project's all buckets usage",
|
||||||
|
MethodName: "GenGetBucketUsageRollups",
|
||||||
|
Response: []accounting.BucketUsageRollup{},
|
||||||
|
Params: []apigen.Param{
|
||||||
|
apigen.NewParam("projectID", uuid.UUID{}),
|
||||||
|
apigen.NewParam("since", time.Time{}),
|
||||||
|
apigen.NewParam("before", time.Time{}),
|
||||||
|
},
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
a.MustWrite("satellite/console/consoleweb/consoleapi/api.gen.go")
|
a.MustWrite("satellite/console/consoleweb/consoleapi/api.gen.go")
|
||||||
|
@ -1735,6 +1735,38 @@ func (s *Service) GetBucketUsageRollups(ctx context.Context, projectID uuid.UUID
|
|||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GenGetBucketUsageRollups retrieves summed usage rollups for every bucket of particular project for a given period for generated api.
|
||||||
|
func (s *Service) GenGetBucketUsageRollups(ctx context.Context, projectID uuid.UUID, since, before time.Time) (rollups []accounting.BucketUsageRollup, httpError api.HTTPError) {
|
||||||
|
var err error
|
||||||
|
defer mon.Task()(&ctx)(&err)
|
||||||
|
|
||||||
|
auth, err := s.getAuthAndAuditLog(ctx, "get bucket usage rollups", zap.String("projectID", projectID.String()))
|
||||||
|
if err != nil {
|
||||||
|
return nil, api.HTTPError{
|
||||||
|
Status: http.StatusUnauthorized,
|
||||||
|
Err: Error.Wrap(err),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = s.isProjectMember(ctx, auth.User.ID, projectID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, api.HTTPError{
|
||||||
|
Status: http.StatusUnauthorized,
|
||||||
|
Err: Error.Wrap(err),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rollups, err = s.projectAccounting.GetBucketUsageRollups(ctx, projectID, since, before)
|
||||||
|
if err != nil {
|
||||||
|
return nil, api.HTTPError{
|
||||||
|
Status: http.StatusInternalServerError,
|
||||||
|
Err: Error.Wrap(err),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// GenGetSingleBucketUsageRollup retrieves usage rollup for single bucket of particular project for a given period for generated api.
|
// GenGetSingleBucketUsageRollup retrieves usage rollup for single bucket of particular project for a given period for generated api.
|
||||||
func (s *Service) GenGetSingleBucketUsageRollup(ctx context.Context, projectID uuid.UUID, bucket string, since, before time.Time) (rollup *accounting.BucketUsageRollup, httpError api.HTTPError) {
|
func (s *Service) GenGetSingleBucketUsageRollup(ctx context.Context, projectID uuid.UUID, bucket string, since, before time.Time) (rollup *accounting.BucketUsageRollup, httpError api.HTTPError) {
|
||||||
var err error
|
var err error
|
||||||
|
Loading…
Reference in New Issue
Block a user