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 }