Skip to content

Commit

Permalink
multinode/payouts: all satellites summaries added.
Browse files Browse the repository at this point in the history
payout summaries for specific/all periods added.

Change-Id: I92087edec548c0418a0f543d643e59f5c7df9621
  • Loading branch information
Qweder93 committed May 12, 2021
1 parent 547a6e9 commit 1956169
Show file tree
Hide file tree
Showing 12 changed files with 794 additions and 76 deletions.
47 changes: 47 additions & 0 deletions multinode/console/controllers/payouts.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,53 @@ func (controller *Payouts) Estimations(w http.ResponseWriter, r *http.Request) {
}
}

// PeriodSummary handles retrieval from nodes for specific period.
func (controller *Payouts) PeriodSummary(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
var err error
defer mon.Task()(&ctx)(&err)

segmentParams := mux.Vars(r)
w.Header().Add("Content-Type", "application/json")

period, ok := segmentParams["period"]
if !ok {
controller.serveError(w, http.StatusBadRequest, ErrPayouts.Wrap(err))
return
}

summary, err := controller.service.NodesPeriodSummary(ctx, period)
if err != nil {
controller.serveError(w, http.StatusInternalServerError, ErrPayouts.Wrap(err))
return
}

if err = json.NewEncoder(w).Encode(summary); err != nil {
controller.log.Error("failed to write json response", zap.Error(err))
return
}
}

// Summary handles retrieval from nodes.
func (controller *Payouts) Summary(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
var err error
defer mon.Task()(&ctx)(&err)

w.Header().Add("Content-Type", "application/json")

summary, err := controller.service.NodesSummary(ctx)
if err != nil {
controller.serveError(w, http.StatusInternalServerError, ErrPayouts.Wrap(err))
return
}

if err = json.NewEncoder(w).Encode(summary); err != nil {
controller.log.Error("failed to write json response", zap.Error(err))
return
}
}

// serveError set http statuses and send json error.
func (controller *Payouts) serveError(w http.ResponseWriter, status int, err error) {
w.WriteHeader(status)
Expand Down
2 changes: 2 additions & 0 deletions multinode/console/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ func NewServer(log *zap.Logger, config Config, nodes *nodes.Service, payouts *pa

payoutsController := controllers.NewPayouts(server.log, server.payouts)
payoutsRouter := apiRouter.PathPrefix("/payouts").Subrouter()
payoutsRouter.HandleFunc("/summary/{period}", payoutsController.PeriodSummary).Methods(http.MethodGet)
payoutsRouter.HandleFunc("/summary", payoutsController.Summary).Methods(http.MethodGet)
payoutsRouter.HandleFunc("/total-earned", payoutsController.GetAllNodesTotalEarned).Methods(http.MethodGet)
payoutsRouter.HandleFunc("/estimations/{satelliteID}", payoutsController.SatelliteEstimations).Methods(http.MethodGet)
payoutsRouter.HandleFunc("/estimations", payoutsController.Estimations).Methods(http.MethodGet)
Expand Down
15 changes: 15 additions & 0 deletions multinode/payouts/payouts.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,18 @@ type SatelliteSummary struct {
SatelliteID storj.NodeID `json:"satelliteID"`
Earned int64 `json:"earned"`
}

// NodeSummary contains node's payout information.
type NodeSummary struct {
NodeID storj.NodeID `json:"nodeId"`
Held int64 `json:"held"`
Paid int64 `json:"paid"`
}

// Summary contains payouts page data.
type Summary struct {
TotalEarned int64 `json:"totalEarned"`
TotalHeld int64 `json:"totalHeld"`
TotalPaid int64 `json:"totalPaid"`
NodeSummary []NodeSummary `json:"nodeSummary"`
}
114 changes: 114 additions & 0 deletions multinode/payouts/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,120 @@ func (service *Service) GetAllNodesEarnedOnSatellite(ctx context.Context) (earne
return earned, nil
}

// NodesSummary returns all satellites all time stats.
func (service *Service) NodesSummary(ctx context.Context) (_ Summary, err error) {
defer mon.Task()(&ctx)(&err)

var summary Summary

list, err := service.nodes.List(ctx)
if err != nil {
return Summary{}, Error.Wrap(err)
}

for _, node := range list {
info, err := service.getAllSatellitesAllTime(ctx, node)
if err != nil {
return Summary{}, Error.Wrap(err)
}

summary.TotalPaid += info.Paid
summary.TotalHeld += info.Held
summary.NodeSummary = append(summary.NodeSummary, NodeSummary{
NodeID: node.ID,
Held: info.Held,
Paid: info.Paid,
})
}

summary.TotalEarned = summary.TotalPaid + summary.TotalHeld

return summary, nil
}

// NodesPeriodSummary returns all satellites stats for specific period.
func (service *Service) NodesPeriodSummary(ctx context.Context, period string) (_ Summary, err error) {
defer mon.Task()(&ctx)(&err)

var summary Summary

list, err := service.nodes.List(ctx)
if err != nil {
return Summary{}, Error.Wrap(err)
}

for _, node := range list {
info, err := service.getAllSatellitesPeriod(ctx, node, period)
if err != nil {
return Summary{}, Error.Wrap(err)
}

summary.TotalPaid += info.Paid
summary.TotalHeld += info.Held
summary.NodeSummary = append(summary.NodeSummary, NodeSummary{
NodeID: node.ID,
Held: info.Held,
Paid: info.Paid,
})
}

summary.TotalEarned = summary.TotalPaid + summary.TotalHeld

return summary, nil
}

func (service *Service) getAllSatellitesPeriod(ctx context.Context, node nodes.Node, period string) (info *multinodepb.PayoutInfo, err error) {
conn, err := service.dialer.DialNodeURL(ctx, storj.NodeURL{
ID: node.ID,
Address: node.PublicAddress,
})
if err != nil {
return &multinodepb.PayoutInfo{}, Error.Wrap(err)
}

defer func() {
err = errs.Combine(err, conn.Close())
}()

payoutClient := multinodepb.NewDRPCPayoutClient(conn)
header := &multinodepb.RequestHeader{
ApiKey: node.APISecret,
}

response, err := payoutClient.AllSatellitesPeriodSummary(ctx, &multinodepb.AllSatellitesPeriodSummaryRequest{Header: header, Period: period})
if err != nil {
return &multinodepb.PayoutInfo{}, Error.Wrap(err)
}

return response.PayoutInfo, nil
}

func (service *Service) getAllSatellitesAllTime(ctx context.Context, node nodes.Node) (info *multinodepb.PayoutInfo, err error) {
conn, err := service.dialer.DialNodeURL(ctx, storj.NodeURL{
ID: node.ID,
Address: node.PublicAddress,
})
if err != nil {
return &multinodepb.PayoutInfo{}, Error.Wrap(err)
}

defer func() {
err = errs.Combine(err, conn.Close())
}()

payoutClient := multinodepb.NewDRPCPayoutClient(conn)
header := &multinodepb.RequestHeader{
ApiKey: node.APISecret,
}

response, err := payoutClient.AllSatellitesSummary(ctx, &multinodepb.AllSatellitesSummaryRequest{Header: header})
if err != nil {
return &multinodepb.PayoutInfo{}, Error.Wrap(err)
}

return response.PayoutInfo, nil
}

// AllNodesSatelliteEstimations returns specific satellite all time estimated earnings.
func (service *Service) AllNodesSatelliteEstimations(ctx context.Context, satelliteID storj.NodeID) (_ int64, err error) {
defer mon.Task()(&ctx)(&err)
Expand Down

0 comments on commit 1956169

Please sign in to comment.