forked from TrueCloudLab/frostfs-sdk-go
f9d740487a
Signed-off-by: Evgenii Baidakov <evgenii@nspcc.io>
176 lines
4.4 KiB
Go
176 lines
4.4 KiB
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
|
|
v2reputation "github.com/nspcc-dev/neofs-api-go/v2/reputation"
|
|
rpcapi "github.com/nspcc-dev/neofs-api-go/v2/rpc"
|
|
"github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
|
|
"github.com/nspcc-dev/neofs-sdk-go/reputation"
|
|
)
|
|
|
|
// PrmAnnounceLocalTrust groups parameters of AnnounceLocalTrust operation.
|
|
type PrmAnnounceLocalTrust struct {
|
|
prmCommonMeta
|
|
|
|
epoch uint64
|
|
|
|
trusts []reputation.Trust
|
|
}
|
|
|
|
// SetEpoch sets number of NeoFS epoch in which the trust was assessed.
|
|
// Required parameter, must not be zero.
|
|
func (x *PrmAnnounceLocalTrust) SetEpoch(epoch uint64) {
|
|
x.epoch = epoch
|
|
}
|
|
|
|
// SetValues sets values describing trust of the client to the NeoFS network participants.
|
|
// Required parameter. Must not be empty.
|
|
//
|
|
// Must not be mutated before the end of the operation.
|
|
func (x *PrmAnnounceLocalTrust) SetValues(trusts []reputation.Trust) {
|
|
x.trusts = trusts
|
|
}
|
|
|
|
// AnnounceLocalTrust sends client's trust values to the NeoFS network participants.
|
|
//
|
|
// Any errors (local or remote, including returned status codes) are returned as Go errors,
|
|
// see [apistatus] package for NeoFS-specific error types.
|
|
//
|
|
// Context is required and must not be nil. It is used for network communication.
|
|
//
|
|
// Return errors:
|
|
// - [ErrZeroEpoch]
|
|
// - [ErrMissingTrusts]
|
|
func (c *Client) AnnounceLocalTrust(ctx context.Context, prm PrmAnnounceLocalTrust) error {
|
|
// check parameters
|
|
switch {
|
|
case prm.epoch == 0:
|
|
return ErrZeroEpoch
|
|
case len(prm.trusts) == 0:
|
|
return ErrMissingTrusts
|
|
}
|
|
|
|
// form request body
|
|
reqBody := new(v2reputation.AnnounceLocalTrustRequestBody)
|
|
reqBody.SetEpoch(prm.epoch)
|
|
|
|
trusts := make([]v2reputation.Trust, len(prm.trusts))
|
|
|
|
for i := range prm.trusts {
|
|
prm.trusts[i].WriteToV2(&trusts[i])
|
|
}
|
|
|
|
reqBody.SetTrusts(trusts)
|
|
|
|
// form request
|
|
var req v2reputation.AnnounceLocalTrustRequest
|
|
|
|
req.SetBody(reqBody)
|
|
|
|
// init call context
|
|
|
|
var (
|
|
cc contextCall
|
|
)
|
|
|
|
c.initCallContext(&cc)
|
|
cc.meta = prm.prmCommonMeta
|
|
cc.req = &req
|
|
cc.call = func() (responseV2, error) {
|
|
return rpcapi.AnnounceLocalTrust(&c.c, &req, client.WithContext(ctx))
|
|
}
|
|
|
|
// process call
|
|
if !cc.processCall() {
|
|
return cc.err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// PrmAnnounceIntermediateTrust groups parameters of AnnounceIntermediateTrust operation.
|
|
type PrmAnnounceIntermediateTrust struct {
|
|
prmCommonMeta
|
|
|
|
epoch uint64
|
|
|
|
iter uint32
|
|
|
|
trustSet bool
|
|
trust reputation.PeerToPeerTrust
|
|
}
|
|
|
|
// SetEpoch sets number of NeoFS epoch with which client's calculation algorithm is initialized.
|
|
// Required parameter, must not be zero.
|
|
func (x *PrmAnnounceIntermediateTrust) SetEpoch(epoch uint64) {
|
|
x.epoch = epoch
|
|
}
|
|
|
|
// SetIteration sets current sequence number of the client's calculation algorithm.
|
|
// By default, corresponds to initial (zero) iteration.
|
|
func (x *PrmAnnounceIntermediateTrust) SetIteration(iter uint32) {
|
|
x.iter = iter
|
|
}
|
|
|
|
// SetCurrentValue sets current global trust value computed at the specified iteration
|
|
// of the client's calculation algorithm. Required parameter.
|
|
func (x *PrmAnnounceIntermediateTrust) SetCurrentValue(trust reputation.PeerToPeerTrust) {
|
|
x.trust = trust
|
|
x.trustSet = true
|
|
}
|
|
|
|
// AnnounceIntermediateTrust sends global trust values calculated for the specified NeoFS network participants
|
|
// at some stage of client's calculation algorithm.
|
|
//
|
|
// Any errors (local or remote, including returned status codes) are returned as Go errors,
|
|
// see [apistatus] package for NeoFS-specific error types.
|
|
//
|
|
// Context is required and must not be nil. It is used for network communication.
|
|
//
|
|
// Return errors:
|
|
// - [ErrZeroEpoch]
|
|
// - [ErrMissingTrust]
|
|
func (c *Client) AnnounceIntermediateTrust(ctx context.Context, prm PrmAnnounceIntermediateTrust) error {
|
|
// check parameters
|
|
switch {
|
|
case prm.epoch == 0:
|
|
return ErrZeroEpoch
|
|
case !prm.trustSet:
|
|
return ErrMissingTrust
|
|
}
|
|
|
|
var trust v2reputation.PeerToPeerTrust
|
|
prm.trust.WriteToV2(&trust)
|
|
|
|
// form request body
|
|
reqBody := new(v2reputation.AnnounceIntermediateResultRequestBody)
|
|
reqBody.SetEpoch(prm.epoch)
|
|
reqBody.SetIteration(prm.iter)
|
|
reqBody.SetTrust(&trust)
|
|
|
|
// form request
|
|
var req v2reputation.AnnounceIntermediateResultRequest
|
|
|
|
req.SetBody(reqBody)
|
|
|
|
// init call context
|
|
|
|
var (
|
|
cc contextCall
|
|
)
|
|
|
|
c.initCallContext(&cc)
|
|
cc.meta = prm.prmCommonMeta
|
|
cc.req = &req
|
|
cc.call = func() (responseV2, error) {
|
|
return rpcapi.AnnounceIntermediateResult(&c.c, &req, client.WithContext(ctx))
|
|
}
|
|
|
|
// process call
|
|
if !cc.processCall() {
|
|
return cc.err
|
|
}
|
|
|
|
return nil
|
|
}
|