frostfs-node/pkg/morph/client/audit/wrapper/result.go

145 lines
3.7 KiB
Go
Raw Permalink Normal View History

package audit
import (
"errors"
"fmt"
"github.com/nspcc-dev/neofs-node/pkg/morph/client"
"github.com/nspcc-dev/neofs-node/pkg/morph/client/audit"
auditAPI "github.com/nspcc-dev/neofs-sdk-go/audit"
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
)
// ResultID is an identity of audit result inside audit contract.
type ResultID []byte
var errUnsupported = errors.New("unsupported structure version")
// PutPrm groups parameters of PutAuditResult operation.
type PutPrm struct {
result *auditAPI.Result
client.InvokePrmOptional
}
// SetResult sets audit result.
func (p *PutPrm) SetResult(result *auditAPI.Result) {
p.result = result
}
// PutAuditResult saves passed audit result structure in NeoFS system
// through Audit contract call.
//
// Returns encountered error that caused the saving to interrupt.
func (w *ClientWrapper) PutAuditResult(prm PutPrm) error {
rawResult, err := prm.result.Marshal()
if err != nil {
return fmt.Errorf("could not marshal audit result: %w", err)
}
args := audit.PutAuditResultArgs{}
args.SetRawResult(rawResult)
args.InvokePrmOptional = prm.InvokePrmOptional
return w.client.
PutAuditResult(args)
}
// ListAllAuditResultID returns a list of all audit result IDs inside audit contract.
func (w *ClientWrapper) ListAllAuditResultID() ([]ResultID, error) {
args := audit.ListResultsArgs{}
values, err := w.client.ListAuditResults(args)
if err != nil {
return nil, err
}
return parseRawResult(values), nil
}
// ListAuditResultIDByEpoch returns a list of audit result IDs inside audit
// contract for specific epoch number.
func (w *ClientWrapper) ListAuditResultIDByEpoch(epoch uint64) ([]ResultID, error) {
args := audit.ListResultsByEpochArgs{}
args.SetEpoch(int64(epoch))
values, err := w.client.ListAuditResultsByEpoch(args)
if err != nil {
return nil, err
}
return parseRawResult(values), nil
}
// ListAuditResultIDByCID returns a list of audit result IDs inside audit
// contract for specific epoch number and container ID.
func (w *ClientWrapper) ListAuditResultIDByCID(epoch uint64, cid *cid.ID) ([]ResultID, error) {
args := audit.ListResultsByCIDArgs{}
args.SetEpoch(int64(epoch))
v2 := cid.ToV2()
if v2 == nil {
return nil, errUnsupported // use other major version if there any
}
args.SetCID(v2.GetValue())
values, err := w.client.ListAuditResultsByCID(args)
if err != nil {
return nil, err
}
return parseRawResult(values), nil
}
// ListAuditResultIDByNode returns a list of audit result IDs inside audit
// contract for specific epoch number, container ID and inner ring public key.
func (w *ClientWrapper) ListAuditResultIDByNode(epoch uint64, cid *cid.ID, key []byte) ([]ResultID, error) {
args := audit.ListResultsByNodeArgs{}
args.SetEpoch(int64(epoch))
args.SetNodeKey(key)
v2 := cid.ToV2()
if v2 == nil {
return nil, errUnsupported // use other major version if there any
}
args.SetCID(v2.GetValue())
values, err := w.client.ListAuditResultsByNode(args)
if err != nil {
return nil, err
}
return parseRawResult(values), nil
}
func parseRawResult(values *audit.ListResultsValues) []ResultID {
rawResults := values.RawResults()
result := make([]ResultID, 0, len(rawResults))
for i := range rawResults {
result = append(result, rawResults[i])
}
return result
}
// GetAuditResult returns audit result structure stored in audit contract.
func (w *ClientWrapper) GetAuditResult(id ResultID) (*auditAPI.Result, error) {
args := audit.GetAuditResultArgs{}
args.SetID(id)
value, err := w.client.GetAuditResult(args)
if err != nil {
return nil, err
}
auditRes := auditAPI.NewResult()
if err := auditRes.Unmarshal(value.Result()); err != nil {
return nil, fmt.Errorf("could not unmarshal audit result structure: %w", err)
}
return auditRes, nil
}