diff options
Diffstat (limited to 'workhorse/internal/lfs')
-rw-r--r-- | workhorse/internal/lfs/lfs.go | 55 | ||||
-rw-r--r-- | workhorse/internal/lfs/lfs_test.go | 61 |
2 files changed, 116 insertions, 0 deletions
diff --git a/workhorse/internal/lfs/lfs.go b/workhorse/internal/lfs/lfs.go new file mode 100644 index 00000000000..ec48dc05ef9 --- /dev/null +++ b/workhorse/internal/lfs/lfs.go @@ -0,0 +1,55 @@ +/* +In this file we handle git lfs objects downloads and uploads +*/ + +package lfs + +import ( + "fmt" + "net/http" + + "gitlab.com/gitlab-org/gitlab-workhorse/internal/api" + "gitlab.com/gitlab-org/gitlab-workhorse/internal/config" + "gitlab.com/gitlab-org/gitlab-workhorse/internal/filestore" + "gitlab.com/gitlab-org/gitlab-workhorse/internal/upload" +) + +type object struct { + size int64 + oid string +} + +func (l *object) Verify(fh *filestore.FileHandler) error { + if fh.Size != l.size { + return fmt.Errorf("LFSObject: expected size %d, wrote %d", l.size, fh.Size) + } + + if fh.SHA256() != l.oid { + return fmt.Errorf("LFSObject: expected sha256 %s, got %s", l.oid, fh.SHA256()) + } + + return nil +} + +type uploadPreparer struct { + objectPreparer upload.Preparer +} + +func NewLfsUploadPreparer(c config.Config, objectPreparer upload.Preparer) upload.Preparer { + return &uploadPreparer{objectPreparer: objectPreparer} +} + +func (l *uploadPreparer) Prepare(a *api.Response) (*filestore.SaveFileOpts, upload.Verifier, error) { + opts, _, err := l.objectPreparer.Prepare(a) + if err != nil { + return nil, nil, err + } + + opts.TempFilePrefix = a.LfsOid + + return opts, &object{oid: a.LfsOid, size: a.LfsSize}, nil +} + +func PutStore(a *api.API, h http.Handler, p upload.Preparer) http.Handler { + return upload.BodyUploader(a, h, p) +} diff --git a/workhorse/internal/lfs/lfs_test.go b/workhorse/internal/lfs/lfs_test.go new file mode 100644 index 00000000000..828ed1bfe90 --- /dev/null +++ b/workhorse/internal/lfs/lfs_test.go @@ -0,0 +1,61 @@ +package lfs_test + +import ( + "testing" + + "gitlab.com/gitlab-org/gitlab-workhorse/internal/api" + "gitlab.com/gitlab-org/gitlab-workhorse/internal/config" + "gitlab.com/gitlab-org/gitlab-workhorse/internal/lfs" + "gitlab.com/gitlab-org/gitlab-workhorse/internal/upload" + + "github.com/stretchr/testify/require" +) + +func TestLfsUploadPreparerWithConfig(t *testing.T) { + lfsOid := "abcd1234" + creds := config.S3Credentials{ + AwsAccessKeyID: "test-key", + AwsSecretAccessKey: "test-secret", + } + + c := config.Config{ + ObjectStorageCredentials: config.ObjectStorageCredentials{ + Provider: "AWS", + S3Credentials: creds, + }, + } + + r := &api.Response{ + LfsOid: lfsOid, + RemoteObject: api.RemoteObject{ + ID: "the upload ID", + UseWorkhorseClient: true, + ObjectStorage: &api.ObjectStorageParams{ + Provider: "AWS", + }, + }, + } + + uploadPreparer := upload.NewObjectStoragePreparer(c) + lfsPreparer := lfs.NewLfsUploadPreparer(c, uploadPreparer) + opts, verifier, err := lfsPreparer.Prepare(r) + + require.NoError(t, err) + require.Equal(t, lfsOid, opts.TempFilePrefix) + require.True(t, opts.ObjectStorageConfig.IsAWS()) + require.True(t, opts.UseWorkhorseClient) + require.Equal(t, creds, opts.ObjectStorageConfig.S3Credentials) + require.NotNil(t, verifier) +} + +func TestLfsUploadPreparerWithNoConfig(t *testing.T) { + c := config.Config{} + r := &api.Response{RemoteObject: api.RemoteObject{ID: "the upload ID"}} + uploadPreparer := upload.NewObjectStoragePreparer(c) + lfsPreparer := lfs.NewLfsUploadPreparer(c, uploadPreparer) + opts, verifier, err := lfsPreparer.Prepare(r) + + require.NoError(t, err) + require.False(t, opts.UseWorkhorseClient) + require.NotNil(t, verifier) +} |