1// Copyright (C) 2021 Storj Labs, Inc.
2// See LICENSE for copying information.
3
4package audit
5
6import (
7	"context"
8
9	"github.com/zeebo/errs"
10
11	"storj.io/common/errs2"
12	"storj.io/common/rpc"
13	"storj.io/common/rpc/rpcstatus"
14	"storj.io/storj/satellite/metabase"
15)
16
17// PieceAudit is piece audit status.
18type PieceAudit int
19
20const (
21	// PieceAuditUnknown is unknown piece audit.
22	PieceAuditUnknown PieceAudit = iota
23	// PieceAuditFailure is failed piece audit.
24	PieceAuditFailure
25	// PieceAuditOffline is offline node piece audit.
26	PieceAuditOffline
27	// PieceAuditContained is online but unresponsive node piece audit.
28	PieceAuditContained
29	// PieceAuditSuccess is successful piece audit.
30	PieceAuditSuccess
31)
32
33// Pieces contains pieces structured by piece audit.
34type Pieces struct {
35	Successful metabase.Pieces
36	Failed     metabase.Pieces
37	Offline    metabase.Pieces
38	Contained  metabase.Pieces
39	Unknown    metabase.Pieces
40}
41
42// PieceAuditFromErr returns piece audit based on error.
43func PieceAuditFromErr(err error) PieceAudit {
44	if err == nil {
45		return PieceAuditSuccess
46	}
47
48	if rpc.Error.Has(err) {
49		switch {
50		case errs.Is(err, context.DeadlineExceeded), errs2.IsRPC(err, rpcstatus.Unknown):
51			return PieceAuditOffline
52		default:
53			// TODO: is this path not reachable?
54			return PieceAuditUnknown
55		}
56	}
57
58	switch {
59	case errs2.IsRPC(err, rpcstatus.NotFound):
60		return PieceAuditFailure
61	case errs2.IsRPC(err, rpcstatus.DeadlineExceeded):
62		return PieceAuditContained
63	default:
64		return PieceAuditUnknown
65	}
66}
67