storj.io/uplink@v1.13.0/private/metaclient/client_move.go (about)

     1  // Copyright (C) 2021 Storj Labs, Inc.
     2  // See LICENSE for copying information.
     3  
     4  package metaclient
     5  
     6  import (
     7  	"context"
     8  
     9  	"storj.io/common/pb"
    10  	"storj.io/common/storj"
    11  )
    12  
    13  // BeginMoveObjectParams parameters for BeginMoveObject method.
    14  type BeginMoveObjectParams struct {
    15  	Bucket                []byte
    16  	EncryptedObjectKey    []byte
    17  	NewBucket             []byte
    18  	NewEncryptedObjectKey []byte
    19  }
    20  
    21  // BeginMoveObjectResponse response for BeginMoveObjectResponse request.
    22  type BeginMoveObjectResponse struct {
    23  	StreamID                  storj.StreamID
    24  	EncryptedMetadataKeyNonce storj.Nonce
    25  	EncryptedMetadataKey      []byte
    26  	SegmentKeys               []EncryptedKeyAndNonce
    27  }
    28  
    29  func (params *BeginMoveObjectParams) toRequest(header *pb.RequestHeader) *pb.ObjectBeginMoveRequest {
    30  	return &pb.ObjectBeginMoveRequest{
    31  		Header:                header,
    32  		Bucket:                params.Bucket,
    33  		EncryptedObjectKey:    params.EncryptedObjectKey,
    34  		NewBucket:             params.NewBucket,
    35  		NewEncryptedObjectKey: params.NewEncryptedObjectKey,
    36  	}
    37  }
    38  
    39  // BatchItem returns single item for batch request.
    40  func (params *BeginMoveObjectParams) BatchItem() *pb.BatchRequestItem {
    41  	return &pb.BatchRequestItem{
    42  		Request: &pb.BatchRequestItem_ObjectBeginMove{
    43  			ObjectBeginMove: params.toRequest(nil),
    44  		},
    45  	}
    46  }
    47  
    48  func newBeginMoveObjectResponse(response *pb.ObjectBeginMoveResponse) BeginMoveObjectResponse {
    49  	keys := convertKeys(response.SegmentKeys)
    50  
    51  	return BeginMoveObjectResponse{
    52  		StreamID:                  response.StreamId,
    53  		EncryptedMetadataKeyNonce: response.EncryptedMetadataKeyNonce,
    54  		EncryptedMetadataKey:      response.EncryptedMetadataKey,
    55  		SegmentKeys:               keys,
    56  	}
    57  }
    58  
    59  // BeginMoveObject begins process of moving object from one key to another.
    60  func (client *Client) BeginMoveObject(ctx context.Context, params BeginMoveObjectParams) (_ BeginMoveObjectResponse, err error) {
    61  	defer mon.Task()(&ctx)(&err)
    62  
    63  	var response *pb.ObjectBeginMoveResponse
    64  	err = WithRetry(ctx, func(ctx context.Context) error {
    65  		response, err = client.client.BeginMoveObject(ctx, params.toRequest(client.header()))
    66  		return err
    67  	})
    68  	if err != nil {
    69  		return BeginMoveObjectResponse{}, Error.Wrap(err)
    70  	}
    71  
    72  	return newBeginMoveObjectResponse(response), nil
    73  }
    74  
    75  // FinishMoveObjectParams parameters for FinishMoveObject method.
    76  type FinishMoveObjectParams struct {
    77  	StreamID                     storj.StreamID
    78  	NewBucket                    []byte
    79  	NewEncryptedObjectKey        []byte
    80  	NewEncryptedMetadataKeyNonce storj.Nonce
    81  	NewEncryptedMetadataKey      []byte
    82  	NewSegmentKeys               []EncryptedKeyAndNonce
    83  }
    84  
    85  func (params *FinishMoveObjectParams) toRequest(header *pb.RequestHeader) *pb.ObjectFinishMoveRequest {
    86  	keys := make([]*pb.EncryptedKeyAndNonce, len(params.NewSegmentKeys))
    87  	for i, keyAndNonce := range params.NewSegmentKeys {
    88  		keys[i] = &pb.EncryptedKeyAndNonce{
    89  			Position: &pb.SegmentPosition{
    90  				PartNumber: keyAndNonce.Position.PartNumber,
    91  				Index:      keyAndNonce.Position.Index,
    92  			},
    93  			EncryptedKeyNonce: keyAndNonce.EncryptedKeyNonce,
    94  			EncryptedKey:      keyAndNonce.EncryptedKey,
    95  		}
    96  	}
    97  	return &pb.ObjectFinishMoveRequest{
    98  		Header:                       header,
    99  		StreamId:                     params.StreamID,
   100  		NewBucket:                    params.NewBucket,
   101  		NewEncryptedObjectKey:        params.NewEncryptedObjectKey,
   102  		NewEncryptedMetadataKeyNonce: params.NewEncryptedMetadataKeyNonce,
   103  		NewEncryptedMetadataKey:      params.NewEncryptedMetadataKey,
   104  		NewSegmentKeys:               keys,
   105  	}
   106  }
   107  
   108  // BatchItem returns single item for batch request.
   109  func (params *FinishMoveObjectParams) BatchItem() *pb.BatchRequestItem {
   110  	return &pb.BatchRequestItem{
   111  		Request: &pb.BatchRequestItem_ObjectFinishMove{
   112  			ObjectFinishMove: params.toRequest(nil),
   113  		},
   114  	}
   115  }
   116  
   117  // FinishMoveObject finishes process of moving object from one key to another.
   118  func (client *Client) FinishMoveObject(ctx context.Context, params FinishMoveObjectParams) (err error) {
   119  	defer mon.Task()(&ctx)(&err)
   120  
   121  	err = WithRetry(ctx, func(ctx context.Context) error {
   122  		_, err = client.client.FinishMoveObject(ctx, params.toRequest(client.header()))
   123  		return err
   124  	})
   125  	return Error.Wrap(err)
   126  }