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  }