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 }