github.com/treeverse/lakefs@v1.24.1-0.20240520134607-95648127bfb0/pkg/block/transient/adapter.go (about) 1 package transient 2 3 import ( 4 "context" 5 "crypto/rand" 6 "crypto/sha256" 7 "encoding/hex" 8 "io" 9 "net/http" 10 "net/url" 11 "time" 12 13 "github.com/google/uuid" 14 "github.com/treeverse/lakefs/pkg/block" 15 ) 16 17 type Adapter struct{} 18 19 func New(_ context.Context) *Adapter { 20 return &Adapter{} 21 } 22 23 func (a *Adapter) Put(_ context.Context, _ block.ObjectPointer, _ int64, reader io.Reader, _ block.PutOpts) error { 24 _, err := io.Copy(io.Discard, reader) 25 return err 26 } 27 28 func (a *Adapter) Get(_ context.Context, _ block.ObjectPointer, expectedSize int64) (io.ReadCloser, error) { 29 if expectedSize < 0 { 30 return nil, io.ErrUnexpectedEOF 31 } 32 return io.NopCloser(&io.LimitedReader{R: rand.Reader, N: expectedSize}), nil 33 } 34 35 func (a *Adapter) GetWalker(_ *url.URL) (block.Walker, error) { 36 return nil, block.ErrOperationNotSupported 37 } 38 39 func (a *Adapter) GetPreSignedURL(_ context.Context, _ block.ObjectPointer, _ block.PreSignMode) (string, time.Time, error) { 40 return "", time.Time{}, block.ErrOperationNotSupported 41 } 42 43 func (a *Adapter) Exists(_ context.Context, _ block.ObjectPointer) (bool, error) { 44 return true, nil 45 } 46 47 func (a *Adapter) GetRange(_ context.Context, _ block.ObjectPointer, startPosition int64, endPosition int64) (io.ReadCloser, error) { 48 n := endPosition - startPosition 49 if n < 0 { 50 return nil, io.ErrUnexpectedEOF 51 } 52 reader := &io.LimitedReader{ 53 R: rand.Reader, 54 N: n, 55 } 56 return io.NopCloser(reader), nil 57 } 58 59 func (a *Adapter) GetProperties(_ context.Context, _ block.ObjectPointer) (block.Properties, error) { 60 return block.Properties{}, nil 61 } 62 63 func (a *Adapter) Remove(_ context.Context, _ block.ObjectPointer) error { 64 return nil 65 } 66 67 func (a *Adapter) Copy(_ context.Context, _, _ block.ObjectPointer) error { 68 return nil 69 } 70 71 func (a *Adapter) UploadCopyPart(_ context.Context, _, _ block.ObjectPointer, _ string, _ int) (*block.UploadPartResponse, error) { 72 h := sha256.New() 73 code := h.Sum(nil) 74 etag := hex.EncodeToString(code) 75 return &block.UploadPartResponse{ 76 ETag: etag, 77 }, nil 78 } 79 80 func (a *Adapter) UploadCopyPartRange(_ context.Context, _, _ block.ObjectPointer, _ string, _ int, startPosition, endPosition int64) (*block.UploadPartResponse, error) { 81 n := endPosition - startPosition 82 if n < 0 { 83 return nil, io.ErrUnexpectedEOF 84 } 85 h := sha256.New() 86 code := h.Sum(nil) 87 etag := hex.EncodeToString(code) 88 return &block.UploadPartResponse{ 89 ETag: etag, 90 }, nil 91 } 92 93 func (a *Adapter) CreateMultiPartUpload(_ context.Context, _ block.ObjectPointer, _ *http.Request, _ block.CreateMultiPartUploadOpts) (*block.CreateMultiPartUploadResponse, error) { 94 uid := uuid.New() 95 uploadID := hex.EncodeToString(uid[:]) 96 return &block.CreateMultiPartUploadResponse{ 97 UploadID: uploadID, 98 }, nil 99 } 100 101 func (a *Adapter) UploadPart(_ context.Context, _ block.ObjectPointer, _ int64, reader io.Reader, _ string, _ int) (*block.UploadPartResponse, error) { 102 data, err := io.ReadAll(reader) 103 if err != nil { 104 return nil, err 105 } 106 h := sha256.New() 107 _, err = h.Write(data) 108 if err != nil { 109 return nil, err 110 } 111 code := h.Sum(nil) 112 etag := hex.EncodeToString(code) 113 return &block.UploadPartResponse{ 114 ETag: etag, 115 }, nil 116 } 117 118 func (a *Adapter) AbortMultiPartUpload(context.Context, block.ObjectPointer, string) error { 119 return nil 120 } 121 122 func (a *Adapter) CompleteMultiPartUpload(context.Context, block.ObjectPointer, string, *block.MultipartUploadCompletion) (*block.CompleteMultiPartUploadResponse, error) { 123 const dataSize = 1024 124 data := make([]byte, dataSize) 125 if _, err := rand.Read(data); err != nil { 126 return nil, err 127 } 128 129 h := sha256.New() 130 _, err := h.Write(data) 131 if err != nil { 132 return nil, err 133 } 134 code := h.Sum(nil) 135 codeHex := hex.EncodeToString(code) 136 return &block.CompleteMultiPartUploadResponse{ 137 ETag: codeHex, 138 ContentLength: dataSize, 139 }, nil 140 } 141 142 func (a *Adapter) BlockstoreType() string { 143 return block.BlockstoreTypeTransient 144 } 145 146 func (a *Adapter) GetStorageNamespaceInfo() block.StorageNamespaceInfo { 147 info := block.DefaultStorageNamespaceInfo(block.BlockstoreTypeTransient) 148 info.PreSignSupport = false 149 info.PreSignSupportUI = false 150 info.ImportSupport = false 151 return info 152 } 153 154 func (a *Adapter) ResolveNamespace(storageNamespace, key string, identifierType block.IdentifierType) (block.QualifiedKey, error) { 155 return block.DefaultResolveNamespace(storageNamespace, key, identifierType) 156 } 157 158 func (a *Adapter) RuntimeStats() map[string]string { 159 return nil 160 } 161 162 func (a *Adapter) GetPresignUploadPartURL(_ context.Context, _ block.ObjectPointer, _ string, _ int) (string, error) { 163 return "", block.ErrOperationNotSupported 164 } 165 166 func (a *Adapter) ListParts(_ context.Context, _ block.ObjectPointer, _ string, _ block.ListPartsOpts) (*block.ListPartsResponse, error) { 167 return nil, block.ErrOperationNotSupported 168 }