From 5a471e5002a77b8425215bcf8760b2a6f7ed1316 Mon Sep 17 00:00:00 2001 From: Airat Arifullin Date: Mon, 4 Sep 2023 13:23:10 +0300 Subject: [PATCH] [#121] client: Make PrmObjectDelete fields public * Introduce buildRequest for PrmObjectDelete * Refactor the usage of these params in pool Signed-off-by: Airat Arifullin --- client/object_delete.go | 136 +++++++++++++++++++--------------------- pool/pool.go | 21 +++---- 2 files changed, 72 insertions(+), 85 deletions(-) diff --git a/client/object_delete.go b/client/object_delete.go index 873cf3df..993cd5d9 100644 --- a/client/object_delete.go +++ b/client/object_delete.go @@ -21,71 +21,25 @@ import ( // PrmObjectDelete groups parameters of ObjectDelete operation. type PrmObjectDelete struct { - meta v2session.RequestMetaHeader + XHeaders []string - body v2object.DeleteRequestBody + BearerToken *bearer.Token - addr v2refs.Address + Session *session.Object - keySet bool - key ecdsa.PrivateKey -} + ContainerID *cid.ID -// WithinSession specifies session within which object should be read. -// -// Creator of the session acquires the authorship of the request. -// This may affect the execution of an operation (e.g. access control). -// -// Must be signed. -func (x *PrmObjectDelete) WithinSession(t session.Object) { - var tv2 v2session.Token - t.WriteToV2(&tv2) + ObjectID *oid.ID - x.meta.SetSessionToken(&tv2) -} - -// WithBearerToken attaches bearer token to be used for the operation. -// -// If set, underlying eACL rules will be used in access control. -// -// Must be signed. -func (x *PrmObjectDelete) WithBearerToken(t bearer.Token) { - var v2token acl.BearerToken - t.WriteToV2(&v2token) - x.meta.SetBearerToken(&v2token) -} - -// FromContainer specifies FrostFS container of the object. -// Required parameter. -func (x *PrmObjectDelete) FromContainer(id cid.ID) { - var cidV2 v2refs.ContainerID - id.WriteToV2(&cidV2) - - x.addr.SetContainerID(&cidV2) -} - -// ByID specifies identifier of the requested object. -// Required parameter. -func (x *PrmObjectDelete) ByID(id oid.ID) { - var idV2 v2refs.ObjectID - id.WriteToV2(&idV2) - - x.addr.SetObjectID(&idV2) + Key *ecdsa.PrivateKey } // UseKey specifies private key to sign the requests. // If key is not provided, then Client default key is used. -func (x *PrmObjectDelete) UseKey(key ecdsa.PrivateKey) { - x.keySet = true - x.key = key -} - -// WithXHeaders specifies list of extended headers (string key-value pairs) -// to be attached to the request. Must have an even length. // -// Slice must not be mutated until the operation completes. -func (x *PrmObjectDelete) WithXHeaders(hs ...string) { - writeXHeadersToMeta(hs, &x.meta) +// Deprecated: Use PrmObjectDelete.Key instead. +func (prm *PrmObjectDelete) UseKey(key ecdsa.PrivateKey) { + prm.Key = &key } // ResObjectDelete groups resulting values of ObjectDelete operation. @@ -100,6 +54,54 @@ func (x ResObjectDelete) Tombstone() oid.ID { return x.tomb } +func (prm *PrmObjectDelete) buildRequest(c *Client) (*v2object.DeleteRequest, error) { + if prm.ContainerID == nil { + return nil, errorMissingContainer + } + + if prm.ObjectID == nil { + return nil, errorMissingObject + } + + if len(prm.XHeaders)%2 != 0 { + return nil, errorInvalidXHeaders + } + + meta := new(v2session.RequestMetaHeader) + writeXHeadersToMeta(prm.XHeaders, meta) + + if prm.BearerToken != nil { + v2BearerToken := new(acl.BearerToken) + prm.BearerToken.WriteToV2(v2BearerToken) + meta.SetBearerToken(v2BearerToken) + } + + if prm.Session != nil { + v2SessionToken := new(v2session.Token) + prm.Session.WriteToV2(v2SessionToken) + meta.SetSessionToken(v2SessionToken) + } + + addr := new(v2refs.Address) + + cnrV2 := new(v2refs.ContainerID) + prm.ContainerID.WriteToV2(cnrV2) + addr.SetContainerID(cnrV2) + + objV2 := new(v2refs.ObjectID) + prm.ObjectID.WriteToV2(objV2) + addr.SetObjectID(objV2) + + body := new(v2object.DeleteRequestBody) + body.SetAddress(addr) + + req := new(v2object.DeleteRequest) + req.SetBody(body) + c.prepareRequest(req, meta) + + return req, nil +} + // ObjectDelete marks an object for deletion from the container using FrostFS API protocol. // As a marker, a special unit called a tombstone is placed in the container. // It confirms the user's intent to delete the object, and is itself a container object. @@ -124,32 +126,22 @@ func (x ResObjectDelete) Tombstone() oid.ID { // - *apistatus.ObjectLocked; // - *apistatus.SessionTokenExpired. func (c *Client) ObjectDelete(ctx context.Context, prm PrmObjectDelete) (*ResObjectDelete, error) { - switch { - case prm.addr.GetContainerID() == nil: - return nil, errorMissingContainer - case prm.addr.GetObjectID() == nil: - return nil, errorMissingObject + req, err := prm.buildRequest(c) + if err != nil { + return nil, err } - // form request body - prm.body.SetAddress(&prm.addr) - - // form request - var req v2object.DeleteRequest - req.SetBody(&prm.body) - c.prepareRequest(&req, &prm.meta) - key := c.prm.key - if prm.keySet { - key = prm.key + if prm.Key != nil { + key = *prm.Key } - err := signature.SignServiceMessage(&key, &req) + err = signature.SignServiceMessage(&key, req) if err != nil { return nil, fmt.Errorf("sign request: %w", err) } - resp, err := rpcapi.DeleteObject(&c.c, &req, client.WithContext(ctx)) + resp, err := rpcapi.DeleteObject(&c.c, req, client.WithContext(ctx)) if err != nil { return nil, err } diff --git a/pool/pool.go b/pool/pool.go index b4cc8879..6dc8fb99 100644 --- a/pool/pool.go +++ b/pool/pool.go @@ -799,20 +799,15 @@ func (c *clientWrapper) objectDelete(ctx context.Context, prm PrmObjectDelete) e return err } - var cliPrm sdkClient.PrmObjectDelete - cliPrm.FromContainer(prm.addr.Container()) - cliPrm.ByID(prm.addr.Object()) + cnr := prm.addr.Container() + obj := prm.addr.Object() - if prm.stoken != nil { - cliPrm.WithinSession(*prm.stoken) - } - - if prm.btoken != nil { - cliPrm.WithBearerToken(*prm.btoken) - } - - if prm.key != nil { - cliPrm.UseKey(*prm.key) + cliPrm := sdkClient.PrmObjectDelete{ + BearerToken: prm.btoken, + Session: prm.stoken, + ContainerID: &cnr, + ObjectID: &obj, + Key: prm.key, } start := time.Now()