blob: 974c3e8b5d608c1dbd36e4d5726e176e8fa2195d [file] [log] [blame]
giolekva7be17df2020-03-21 13:57:02 +04001package client
2
giolekva1f6577a2020-03-25 12:53:06 +04003import (
4 "context"
5 "os"
giolekva7be17df2020-03-21 13:57:02 +04006
giolekvad2a029d2020-03-25 23:06:08 +04007 "github.com/giolekva/pcloud/api"
8 "github.com/giolekva/pcloud/chunk"
giolekva1f6577a2020-03-25 12:53:06 +04009)
giolekva7be17df2020-03-21 13:57:02 +040010
11type FileUploader struct {
giolekva1f6577a2020-03-25 12:53:06 +040012 client api.MetadataStorageClient
giolekva7be17df2020-03-21 13:57:02 +040013}
14
giolekva1f6577a2020-03-25 12:53:06 +040015func NewFileUploader(client api.MetadataStorageClient) *FileUploader {
16 return &FileUploader{client}
giolekva7be17df2020-03-21 13:57:02 +040017}
18
giolekvaadf6a342020-03-25 13:27:39 +040019func (fu *FileUploader) Upload(f *os.File, numReplicas int) {
giolekva1f6577a2020-03-25 12:53:06 +040020 info, err := f.Stat()
21 if err != nil {
22 return
giolekva7be17df2020-03-21 13:57:02 +040023 }
giolekva1f6577a2020-03-25 12:53:06 +040024 resp, err := fu.client.CreateBlob(
25 context.Background(), &api.CreateBlobRequest{
26 SizeBytes: int32(info.Size()),
giolekvaadf6a342020-03-25 13:27:39 +040027 NumReplicas: int32(numReplicas)})
giolekva1f6577a2020-03-25 12:53:06 +040028 if err != nil {
29 panic(err)
30 }
giolekvaadf6a342020-03-25 13:27:39 +040031 if len(resp.Chunk) != 1 {
32 panic(resp)
33 }
giolekva2babef22020-03-25 23:27:29 +040034 lis := &chunk.NonChangingReplicaAssignment{}
35 primaryAddressCh := lis.Primary(
giolekva1f6577a2020-03-25 12:53:06 +040036 resp.Chunk[0].ChunkId,
37 resp.Chunk[0].Server[0])
38 chunk.WriteToPrimary(
39 context.Background(),
giolekva2babef22020-03-25 23:27:29 +040040 resp.Chunk[0].ChunkId,
giolekva1f6577a2020-03-25 12:53:06 +040041 chunk.NewReadOnlyFileChunk(f, 0, int(info.Size())),
giolekva2babef22020-03-25 23:27:29 +040042 primaryAddressCh)
giolekva7be17df2020-03-21 13:57:02 +040043}