git.frostfs.info/TrueCloudLab/frostfs-sdk-go@v0.0.0-20241022124111-5361f0ecebd3/client/apemanager_add_chain.go (about)

     1  package client
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	apemanagerV2 "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/apemanager"
     8  	rpcapi "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc"
     9  	"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client"
    10  	sessionV2 "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
    11  	"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/signature"
    12  	apeSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/ape"
    13  	apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
    14  )
    15  
    16  // PrmAPEManagerAddChain groups parameters of APEManagerAddChain operation.
    17  type PrmAPEManagerAddChain struct {
    18  	XHeaders []string
    19  
    20  	ChainTarget apeSDK.ChainTarget
    21  
    22  	Chain apeSDK.Chain
    23  }
    24  
    25  func (prm *PrmAPEManagerAddChain) buildRequest(c *Client) (*apemanagerV2.AddChainRequest, error) {
    26  	if len(prm.XHeaders)%2 != 0 {
    27  		return nil, errorInvalidXHeaders
    28  	}
    29  
    30  	req := new(apemanagerV2.AddChainRequest)
    31  	reqBody := new(apemanagerV2.AddChainRequestBody)
    32  
    33  	reqBody.SetTarget(prm.ChainTarget.ToV2())
    34  	reqBody.SetChain(prm.Chain.ToV2())
    35  
    36  	req.SetBody(reqBody)
    37  
    38  	var meta sessionV2.RequestMetaHeader
    39  	writeXHeadersToMeta(prm.XHeaders, &meta)
    40  
    41  	c.prepareRequest(req, &meta)
    42  
    43  	return req, nil
    44  }
    45  
    46  type ResAPEManagerAddChain struct {
    47  	statusRes
    48  
    49  	// ChainID of set Chain. If Chain does not contain chainID before request, then
    50  	// ChainID is generated.
    51  	ChainID apeSDK.ChainID
    52  }
    53  
    54  // APEManagerAddChain sets Chain for ChainTarget.
    55  func (c *Client) APEManagerAddChain(ctx context.Context, prm PrmAPEManagerAddChain) (*ResAPEManagerAddChain, error) {
    56  	req, err := prm.buildRequest(c)
    57  	if err != nil {
    58  		return nil, err
    59  	}
    60  
    61  	if err := signature.SignServiceMessage(&c.prm.Key, req); err != nil {
    62  		return nil, fmt.Errorf("sign request: %w", err)
    63  	}
    64  
    65  	resp, err := rpcapi.AddChain(&c.c, req, client.WithContext(ctx))
    66  	if err != nil {
    67  		return nil, err
    68  	}
    69  
    70  	var res ResAPEManagerAddChain
    71  	res.st, err = c.processResponse(resp)
    72  	if err != nil || !apistatus.IsSuccessful(res.st) {
    73  		return &res, err
    74  	}
    75  
    76  	res.ChainID = resp.GetBody().GetChainID()
    77  
    78  	return &res, nil
    79  }