git.frostfs.info/TrueCloudLab/frostfs-sdk-go@v0.0.0-20241022124111-5361f0ecebd3/client/container_list.go (about) 1 package client 2 3 import ( 4 "context" 5 "fmt" 6 7 v2container "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container" 8 "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs" 9 rpcapi "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc" 10 "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client" 11 v2session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session" 12 "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/signature" 13 apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status" 14 cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" 15 "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/session" 16 "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user" 17 ) 18 19 // PrmContainerList groups parameters of ContainerList operation. 20 type PrmContainerList struct { 21 XHeaders []string 22 23 Account user.ID 24 25 Session *session.Container 26 } 27 28 // SetAccount sets identifier of the FrostFS account to list the containers. 29 // Required parameter. 30 // 31 // Deprecated: Use PrmContainerList.Account instead. 32 func (x *PrmContainerList) SetAccount(id user.ID) { 33 x.Account = id 34 } 35 36 func (x *PrmContainerList) buildRequest(c *Client) (*v2container.ListRequest, error) { 37 if x.Account.IsEmpty() { 38 return nil, errorAccountNotSet 39 } 40 41 var ownerV2 refs.OwnerID 42 x.Account.WriteToV2(&ownerV2) 43 44 reqBody := new(v2container.ListRequestBody) 45 reqBody.SetOwnerID(&ownerV2) 46 47 var meta v2session.RequestMetaHeader 48 writeXHeadersToMeta(x.XHeaders, &meta) 49 50 if x.Session != nil { 51 var tokv2 v2session.Token 52 x.Session.WriteToV2(&tokv2) 53 54 meta.SetSessionToken(&tokv2) 55 } 56 57 var req v2container.ListRequest 58 req.SetBody(reqBody) 59 c.prepareRequest(&req, &meta) 60 return &req, nil 61 } 62 63 // ResContainerList groups resulting values of ContainerList operation. 64 type ResContainerList struct { 65 statusRes 66 67 ids []cid.ID 68 } 69 70 // Containers returns list of identifiers of the account-owned containers. 71 // 72 // Client doesn't retain value so modification is safe. 73 func (x ResContainerList) Containers() []cid.ID { 74 return x.ids 75 } 76 77 // ContainerList requests identifiers of the account-owned containers. 78 // 79 // Exactly one return value is non-nil. By default, server status is returned in res structure. 80 // Any client's internal or transport errors are returned as `error`. 81 // If PrmInit.DisableFrostFSFailuresResolution has been called, unsuccessful 82 // FrostFS status codes are included in the returned result structure, 83 // otherwise, are also returned as `error`. 84 // 85 // Returns an error if parameters are set incorrectly (see PrmContainerList docs). 86 // Context is required and must not be nil. It is used for network communication. 87 // 88 // Return statuses: 89 // - global (see Client docs). 90 func (c *Client) ContainerList(ctx context.Context, prm PrmContainerList) (*ResContainerList, error) { 91 req, err := prm.buildRequest(c) 92 if err != nil { 93 return nil, err 94 } 95 96 if err := signature.SignServiceMessage(&c.prm.Key, req); err != nil { 97 return nil, fmt.Errorf("sign request: %w", err) 98 } 99 100 resp, err := rpcapi.ListContainers(&c.c, req, client.WithContext(ctx)) 101 if err != nil { 102 return nil, err 103 } 104 105 var res ResContainerList 106 res.st, err = c.processResponse(resp) 107 if err != nil || !apistatus.IsSuccessful(res.st) { 108 return &res, err 109 } 110 111 res.ids = make([]cid.ID, len(resp.GetBody().GetContainerIDs())) 112 for i, cidV2 := range resp.GetBody().GetContainerIDs() { 113 if err := res.ids[i].ReadFromV2(cidV2); err != nil { 114 return &res, fmt.Errorf("invalid ID in the response: %w", err) 115 } 116 } 117 118 return &res, nil 119 }