| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 1 | package client |
| 2 | |
| giolekva | 1f6577a | 2020-03-25 12:53:06 +0400 | [diff] [blame] | 3 | import ( |
| 4 | "context" |
| 5 | "os" |
| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 6 | |
| giolekva | 1f6577a | 2020-03-25 12:53:06 +0400 | [diff] [blame] | 7 | "pcloud/api" |
| 8 | "pcloud/chunk" |
| 9 | ) |
| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 10 | |
| 11 | type FileUploader struct { |
| giolekva | 1f6577a | 2020-03-25 12:53:06 +0400 | [diff] [blame] | 12 | client api.MetadataStorageClient |
| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 13 | } |
| 14 | |
| giolekva | 1f6577a | 2020-03-25 12:53:06 +0400 | [diff] [blame] | 15 | func NewFileUploader(client api.MetadataStorageClient) *FileUploader { |
| 16 | return &FileUploader{client} |
| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 17 | } |
| 18 | |
| giolekva | adf6a34 | 2020-03-25 13:27:39 +0400 | [diff] [blame^] | 19 | func (fu *FileUploader) Upload(f *os.File, numReplicas int) { |
| giolekva | 1f6577a | 2020-03-25 12:53:06 +0400 | [diff] [blame] | 20 | info, err := f.Stat() |
| 21 | if err != nil { |
| 22 | return |
| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 23 | } |
| giolekva | 1f6577a | 2020-03-25 12:53:06 +0400 | [diff] [blame] | 24 | resp, err := fu.client.CreateBlob( |
| 25 | context.Background(), &api.CreateBlobRequest{ |
| 26 | SizeBytes: int32(info.Size()), |
| giolekva | adf6a34 | 2020-03-25 13:27:39 +0400 | [diff] [blame^] | 27 | NumReplicas: int32(numReplicas)}) |
| giolekva | 1f6577a | 2020-03-25 12:53:06 +0400 | [diff] [blame] | 28 | if err != nil { |
| 29 | panic(err) |
| 30 | } |
| giolekva | adf6a34 | 2020-03-25 13:27:39 +0400 | [diff] [blame^] | 31 | if len(resp.Chunk) != 1 { |
| 32 | panic(resp) |
| 33 | } |
| giolekva | 1f6577a | 2020-03-25 12:53:06 +0400 | [diff] [blame] | 34 | primaryListener := chunk.NewNonChangingPrimaryReplicaChangeListener( |
| 35 | resp.Chunk[0].ChunkId, |
| 36 | resp.Chunk[0].Server[0]) |
| 37 | chunk.WriteToPrimary( |
| 38 | context.Background(), |
| 39 | chunk.NewReadOnlyFileChunk(f, 0, int(info.Size())), |
| 40 | primaryListener) |
| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 41 | } |