forked from TrueCloudLab/frostfs-sdk-go
[#263] go.mod: Update api-go
Remove `client.ContainerEACL` and related references. This change was initiated by the removal of `ContainerService.GetExtendedACL` from the API. Signed-off-by: Aleksey Savchuk <a.savchuk@yadro.com>
This commit is contained in:
parent
3c00f4eeac
commit
8f751d9dd0
6 changed files with 3 additions and 250 deletions
|
@ -1,123 +0,0 @@
|
||||||
package client
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
v2container "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container"
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
|
||||||
rpcapi "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc"
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client"
|
|
||||||
v2session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/signature"
|
|
||||||
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
|
|
||||||
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl"
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/session"
|
|
||||||
)
|
|
||||||
|
|
||||||
// PrmContainerEACL groups parameters of ContainerEACL operation.
|
|
||||||
type PrmContainerEACL struct {
|
|
||||||
// FrostFS request X-Headers.
|
|
||||||
XHeaders []string
|
|
||||||
|
|
||||||
ContainerID *cid.ID
|
|
||||||
|
|
||||||
Session *session.Container
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetContainer sets identifier of the FrostFS container to read the eACL table.
|
|
||||||
// Required parameter.
|
|
||||||
//
|
|
||||||
// Deprecated: Use PrmContainerEACL.ContainerID instead.
|
|
||||||
func (x *PrmContainerEACL) SetContainer(id cid.ID) {
|
|
||||||
x.ContainerID = &id
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PrmContainerEACL) buildRequest(c *Client) (*v2container.GetExtendedACLRequest, error) {
|
|
||||||
if x.ContainerID == nil {
|
|
||||||
return nil, errorMissingContainer
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(x.XHeaders)%2 != 0 {
|
|
||||||
return nil, errorInvalidXHeaders
|
|
||||||
}
|
|
||||||
|
|
||||||
var cidV2 refs.ContainerID
|
|
||||||
x.ContainerID.WriteToV2(&cidV2)
|
|
||||||
|
|
||||||
reqBody := new(v2container.GetExtendedACLRequestBody)
|
|
||||||
reqBody.SetContainerID(&cidV2)
|
|
||||||
|
|
||||||
var meta v2session.RequestMetaHeader
|
|
||||||
writeXHeadersToMeta(x.XHeaders, &meta)
|
|
||||||
|
|
||||||
if x.Session != nil {
|
|
||||||
var tokv2 v2session.Token
|
|
||||||
x.Session.WriteToV2(&tokv2)
|
|
||||||
|
|
||||||
meta.SetSessionToken(&tokv2)
|
|
||||||
}
|
|
||||||
|
|
||||||
var req v2container.GetExtendedACLRequest
|
|
||||||
req.SetBody(reqBody)
|
|
||||||
c.prepareRequest(&req, &meta)
|
|
||||||
return &req, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResContainerEACL groups resulting values of ContainerEACL operation.
|
|
||||||
type ResContainerEACL struct {
|
|
||||||
statusRes
|
|
||||||
|
|
||||||
table eacl.Table
|
|
||||||
}
|
|
||||||
|
|
||||||
// Table returns eACL table of the requested container.
|
|
||||||
func (x ResContainerEACL) Table() eacl.Table {
|
|
||||||
return x.table
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerEACL reads eACL table of the FrostFS container.
|
|
||||||
//
|
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
|
||||||
// Any client's internal or transport errors are returned as `error`.
|
|
||||||
// If PrmInit.DisableFrostFSFailuresResolution has been called, unsuccessful
|
|
||||||
// FrostFS status codes are included in the returned result structure,
|
|
||||||
// otherwise, are also returned as `error`.
|
|
||||||
//
|
|
||||||
// Returns an error if parameters are set incorrectly (see PrmContainerEACL docs).
|
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
|
||||||
//
|
|
||||||
// Return statuses:
|
|
||||||
// - global (see Client docs);
|
|
||||||
// - *apistatus.ContainerNotFound;
|
|
||||||
// - *apistatus.EACLNotFound.
|
|
||||||
func (c *Client) ContainerEACL(ctx context.Context, prm PrmContainerEACL) (*ResContainerEACL, error) {
|
|
||||||
req, err := prm.buildRequest(c)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := signature.SignServiceMessage(&c.prm.Key, req); err != nil {
|
|
||||||
return nil, fmt.Errorf("sign request: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
resp, err := rpcapi.GetEACL(&c.c, req, client.WithContext(ctx))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var res ResContainerEACL
|
|
||||||
res.st, err = c.processResponse(resp)
|
|
||||||
if err != nil || !apistatus.IsSuccessful(res.st) {
|
|
||||||
return &res, err
|
|
||||||
}
|
|
||||||
|
|
||||||
eACL := resp.GetBody().GetEACL()
|
|
||||||
if eACL == nil {
|
|
||||||
return &res, newErrMissingResponseField("eACL")
|
|
||||||
}
|
|
||||||
|
|
||||||
res.table = *eacl.NewTableFromV2(eACL)
|
|
||||||
return &res, nil
|
|
||||||
}
|
|
2
go.mod
2
go.mod
|
@ -3,7 +3,7 @@ module git.frostfs.info/TrueCloudLab/frostfs-sdk-go
|
||||||
go 1.22
|
go 1.22
|
||||||
|
|
||||||
require (
|
require (
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-api-go/v2 v2.16.1-0.20240827080218-5fece80b4203
|
git.frostfs.info/TrueCloudLab/frostfs-api-go/v2 v2.16.1-0.20240902111049-c11f50efeccb
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-contract v0.19.3-0.20240621131249-49e5270f673e
|
git.frostfs.info/TrueCloudLab/frostfs-contract v0.19.3-0.20240621131249-49e5270f673e
|
||||||
git.frostfs.info/TrueCloudLab/hrw v1.2.1
|
git.frostfs.info/TrueCloudLab/hrw v1.2.1
|
||||||
git.frostfs.info/TrueCloudLab/tzhash v1.8.0
|
git.frostfs.info/TrueCloudLab/tzhash v1.8.0
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -1,5 +1,5 @@
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-api-go/v2 v2.16.1-0.20240827080218-5fece80b4203 h1:GtBJrT2x03XAiOqyQBUa1XXjDBGxsW5ahCv1W8qyj60=
|
git.frostfs.info/TrueCloudLab/frostfs-api-go/v2 v2.16.1-0.20240902111049-c11f50efeccb h1:p9ByDsw+H6p6LyYSx8LKFtAG/oPKQpDVMNfjPqdevTw=
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-api-go/v2 v2.16.1-0.20240827080218-5fece80b4203/go.mod h1:BDnEpkKMykCS8u1nLzR6SgNzCv6885RWlo5TnravQuI=
|
git.frostfs.info/TrueCloudLab/frostfs-api-go/v2 v2.16.1-0.20240902111049-c11f50efeccb/go.mod h1:BDnEpkKMykCS8u1nLzR6SgNzCv6885RWlo5TnravQuI=
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-contract v0.19.3-0.20240621131249-49e5270f673e h1:kcBqZBiFIUBATUqEuvVigtkJJWQ2Gug/eYXn967o3M4=
|
git.frostfs.info/TrueCloudLab/frostfs-contract v0.19.3-0.20240621131249-49e5270f673e h1:kcBqZBiFIUBATUqEuvVigtkJJWQ2Gug/eYXn967o3M4=
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-contract v0.19.3-0.20240621131249-49e5270f673e/go.mod h1:F/fe1OoIDKr5Bz99q4sriuHDuf3aZefZy9ZsCqEtgxc=
|
git.frostfs.info/TrueCloudLab/frostfs-contract v0.19.3-0.20240621131249-49e5270f673e/go.mod h1:F/fe1OoIDKr5Bz99q4sriuHDuf3aZefZy9ZsCqEtgxc=
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-crypto v0.6.0 h1:FxqFDhQYYgpe41qsIHVOcdzSVCB8JNSfPG7Uk4r2oSk=
|
git.frostfs.info/TrueCloudLab/frostfs-crypto v0.6.0 h1:FxqFDhQYYgpe41qsIHVOcdzSVCB8JNSfPG7Uk4r2oSk=
|
||||||
|
|
|
@ -14,7 +14,6 @@ import (
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container"
|
||||||
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
frostfsecdsa "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto/ecdsa"
|
frostfsecdsa "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto/ecdsa"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl"
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/session"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/session"
|
||||||
|
@ -95,14 +94,6 @@ func (m *mockClient) containerDelete(context.Context, PrmContainerDelete) error
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *mockClient) containerEACL(context.Context, PrmContainerEACL) (eacl.Table, error) {
|
|
||||||
return eacl.Table{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *mockClient) containerSetEACL(context.Context, PrmContainerSetEACL) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *mockClient) apeManagerAddChain(ctx context.Context, prm PrmAddAPEChain) error {
|
func (c *mockClient) apeManagerAddChain(ctx context.Context, prm PrmAddAPEChain) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
105
pool/pool.go
105
pool/pool.go
|
@ -22,7 +22,6 @@ import (
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container"
|
||||||
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
frostfsecdsa "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto/ecdsa"
|
frostfsecdsa "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto/ecdsa"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl"
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
||||||
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
|
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
|
||||||
|
@ -50,8 +49,6 @@ type client interface {
|
||||||
containerList(context.Context, PrmContainerList) ([]cid.ID, error)
|
containerList(context.Context, PrmContainerList) ([]cid.ID, error)
|
||||||
// see clientWrapper.containerDelete.
|
// see clientWrapper.containerDelete.
|
||||||
containerDelete(context.Context, PrmContainerDelete) error
|
containerDelete(context.Context, PrmContainerDelete) error
|
||||||
// see clientWrapper.containerEACL.
|
|
||||||
containerEACL(context.Context, PrmContainerEACL) (eacl.Table, error)
|
|
||||||
// see clientWrapper.apeManagerAddChain.
|
// see clientWrapper.apeManagerAddChain.
|
||||||
apeManagerAddChain(context.Context, PrmAddAPEChain) error
|
apeManagerAddChain(context.Context, PrmAddAPEChain) error
|
||||||
// see clientWrapper.apeManagerRemoveChain.
|
// see clientWrapper.apeManagerRemoveChain.
|
||||||
|
@ -152,8 +149,6 @@ const (
|
||||||
methodContainerGet
|
methodContainerGet
|
||||||
methodContainerList
|
methodContainerList
|
||||||
methodContainerDelete
|
methodContainerDelete
|
||||||
methodContainerEACL
|
|
||||||
methodContainerSetEACL
|
|
||||||
methodEndpointInfo
|
methodEndpointInfo
|
||||||
methodNetworkInfo
|
methodNetworkInfo
|
||||||
methodNetMapSnapshot
|
methodNetMapSnapshot
|
||||||
|
@ -183,10 +178,6 @@ func (m MethodIndex) String() string {
|
||||||
return "containerList"
|
return "containerList"
|
||||||
case methodContainerDelete:
|
case methodContainerDelete:
|
||||||
return "containerDelete"
|
return "containerDelete"
|
||||||
case methodContainerEACL:
|
|
||||||
return "containerEACL"
|
|
||||||
case methodContainerSetEACL:
|
|
||||||
return "containerSetEACL"
|
|
||||||
case methodEndpointInfo:
|
case methodEndpointInfo:
|
||||||
return "endpointInfo"
|
return "endpointInfo"
|
||||||
case methodNetworkInfo:
|
case methodNetworkInfo:
|
||||||
|
@ -579,32 +570,6 @@ func (c *clientWrapper) containerDelete(ctx context.Context, prm PrmContainerDel
|
||||||
return waitForContainerRemoved(ctx, c, getPrm, prm.WaitParams)
|
return waitForContainerRemoved(ctx, c, getPrm, prm.WaitParams)
|
||||||
}
|
}
|
||||||
|
|
||||||
// containerEACL invokes sdkClient.ContainerEACL parse response status to error and return result as is.
|
|
||||||
func (c *clientWrapper) containerEACL(ctx context.Context, prm PrmContainerEACL) (eacl.Table, error) {
|
|
||||||
cl, err := c.getClient()
|
|
||||||
if err != nil {
|
|
||||||
return eacl.Table{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
cliPrm := sdkClient.PrmContainerEACL{
|
|
||||||
ContainerID: &prm.ContainerID,
|
|
||||||
Session: prm.Session,
|
|
||||||
}
|
|
||||||
|
|
||||||
start := time.Now()
|
|
||||||
res, err := cl.ContainerEACL(ctx, cliPrm)
|
|
||||||
c.incRequests(time.Since(start), methodContainerEACL)
|
|
||||||
var st apistatus.Status
|
|
||||||
if res != nil {
|
|
||||||
st = res.Status()
|
|
||||||
}
|
|
||||||
if err = c.handleError(ctx, st, err); err != nil {
|
|
||||||
return eacl.Table{}, fmt.Errorf("get eacl on client: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return res.Table(), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// apeManagerAddChain invokes sdkClient.APEManagerAddChain and parse response status to error.
|
// apeManagerAddChain invokes sdkClient.APEManagerAddChain and parse response status to error.
|
||||||
func (c *clientWrapper) apeManagerAddChain(ctx context.Context, prm PrmAddAPEChain) error {
|
func (c *clientWrapper) apeManagerAddChain(ctx context.Context, prm PrmAddAPEChain) error {
|
||||||
cl, err := c.getClient()
|
cl, err := c.getClient()
|
||||||
|
@ -1871,29 +1836,6 @@ func (x *PrmContainerDelete) SetWaitParams(waitParams WaitParams) {
|
||||||
x.WaitParams = &waitParams
|
x.WaitParams = &waitParams
|
||||||
}
|
}
|
||||||
|
|
||||||
// PrmContainerEACL groups parameters of GetEACL operation.
|
|
||||||
type PrmContainerEACL struct {
|
|
||||||
ContainerID cid.ID
|
|
||||||
|
|
||||||
Session *session.Container
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetContainerID specifies identifier of the FrostFS container to read the eACL table.
|
|
||||||
//
|
|
||||||
// Deprecated: Use PrmContainerEACL.ContainerID instead.
|
|
||||||
func (x *PrmContainerEACL) SetContainerID(cnrID cid.ID) {
|
|
||||||
x.ContainerID = cnrID
|
|
||||||
}
|
|
||||||
|
|
||||||
// PrmContainerSetEACL groups parameters of SetEACL operation.
|
|
||||||
type PrmContainerSetEACL struct {
|
|
||||||
Table eacl.Table
|
|
||||||
|
|
||||||
Session *session.Container
|
|
||||||
|
|
||||||
WaitParams *WaitParams
|
|
||||||
}
|
|
||||||
|
|
||||||
type PrmAddAPEChain struct {
|
type PrmAddAPEChain struct {
|
||||||
Target ape.ChainTarget
|
Target ape.ChainTarget
|
||||||
|
|
||||||
|
@ -1910,36 +1852,6 @@ type PrmListAPEChains struct {
|
||||||
Target ape.ChainTarget
|
Target ape.ChainTarget
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetTable sets structure of container's extended ACL to be used as a
|
|
||||||
// parameter of the base client's operation.
|
|
||||||
//
|
|
||||||
// See git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client.PrmContainerSetEACL.SetTable.
|
|
||||||
//
|
|
||||||
// Deprecated: Use PrmContainerSetEACL.Table instead.
|
|
||||||
func (x *PrmContainerSetEACL) SetTable(table eacl.Table) {
|
|
||||||
x.Table = table
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithinSession specifies session to be used as a parameter of the base
|
|
||||||
// client's operation.
|
|
||||||
//
|
|
||||||
// See git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client.PrmContainerSetEACL.WithinSession.
|
|
||||||
//
|
|
||||||
// Deprecated: Use PrmContainerSetEACL.Session instead.
|
|
||||||
func (x *PrmContainerSetEACL) WithinSession(s session.Container) {
|
|
||||||
x.Session = &s
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetWaitParams specifies timeout params to complete operation.
|
|
||||||
// If not provided the default one will be used.
|
|
||||||
// Panics if any of the wait params isn't positive.
|
|
||||||
//
|
|
||||||
// Deprecated: Use PrmContainerSetEACL.WaitParams instead.
|
|
||||||
func (x *PrmContainerSetEACL) SetWaitParams(waitParams WaitParams) {
|
|
||||||
waitParams.checkForPositive()
|
|
||||||
x.WaitParams = &waitParams
|
|
||||||
}
|
|
||||||
|
|
||||||
// PrmBalanceGet groups parameters of Balance operation.
|
// PrmBalanceGet groups parameters of Balance operation.
|
||||||
type PrmBalanceGet struct {
|
type PrmBalanceGet struct {
|
||||||
account user.ID
|
account user.ID
|
||||||
|
@ -2934,23 +2846,6 @@ func (p *Pool) DeleteContainer(ctx context.Context, prm PrmContainerDelete) erro
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetEACL reads eACL table of the FrostFS container.
|
|
||||||
//
|
|
||||||
// Main return value MUST NOT be processed on an erroneous return.
|
|
||||||
func (p *Pool) GetEACL(ctx context.Context, prm PrmContainerEACL) (eacl.Table, error) {
|
|
||||||
cp, err := p.connection()
|
|
||||||
if err != nil {
|
|
||||||
return eacl.Table{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
eaclResult, err := cp.containerEACL(ctx, prm)
|
|
||||||
if err != nil {
|
|
||||||
return eacl.Table{}, fmt.Errorf("get EACL via client '%s': %w", cp.address(), err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return eaclResult, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddAPEChain sends a request to set APE chain rules for a target (basically, for a container).
|
// AddAPEChain sends a request to set APE chain rules for a target (basically, for a container).
|
||||||
func (p *Pool) AddAPEChain(ctx context.Context, prm PrmAddAPEChain) error {
|
func (p *Pool) AddAPEChain(ctx context.Context, prm PrmAddAPEChain) error {
|
||||||
cp, err := p.connection()
|
cp, err := p.connection()
|
||||||
|
|
|
@ -102,16 +102,6 @@ func (n NodeStatistic) AverageDeleteContainer() time.Duration {
|
||||||
return n.averageTime(methodContainerDelete)
|
return n.averageTime(methodContainerDelete)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AverageGetContainerEACL returns average time to perform ContainerEACL request.
|
|
||||||
func (n NodeStatistic) AverageGetContainerEACL() time.Duration {
|
|
||||||
return n.averageTime(methodContainerEACL)
|
|
||||||
}
|
|
||||||
|
|
||||||
// AverageSetContainerEACL returns average time to perform ContainerSetEACL request.
|
|
||||||
func (n NodeStatistic) AverageSetContainerEACL() time.Duration {
|
|
||||||
return n.averageTime(methodContainerSetEACL)
|
|
||||||
}
|
|
||||||
|
|
||||||
// AverageEndpointInfo returns average time to perform EndpointInfo request.
|
// AverageEndpointInfo returns average time to perform EndpointInfo request.
|
||||||
func (n NodeStatistic) AverageEndpointInfo() time.Duration {
|
func (n NodeStatistic) AverageEndpointInfo() time.Duration {
|
||||||
return n.averageTime(methodEndpointInfo)
|
return n.averageTime(methodEndpointInfo)
|
||||||
|
|
Loading…
Reference in a new issue