chore: update protobuf to reuse file request (#21447)

**This is just the protobuf changes for the PR https://github.com/coder/coder/pull/21398**

Moved `UploadFileRequest` from `provisionerd.proto` -> `provisioner.proto`.

Renamed to `FileUpload` because it is now bi-directional.

This **is backwards compatible**. I tested it to confirm the payloads are identical.  Types were just renamed and moved around.

```golang
func TestTypeUpgrade(t *testing.T) {
	t.Parallel()

	x := &proto2.UploadFileRequest{
		Type: &proto2.UploadFileRequest_ChunkPiece{
			ChunkPiece: &proto.ChunkPiece{
				Data:         []byte("Hello World!"),
				FullDataHash: []byte("Foobar"),
				PieceIndex:   42,
			},
		},
	}

	data, err := protobuf.Marshal(x)
	require.NoError(t, err)

	// Exactly the same output
	// EhgKDEhlbGxvIFdvcmxkIRIGRm9vYmFyGCo= on `main`
	// EhgKDEhlbGxvIFdvcmxkIRIGRm9vYmFyGCo= on this branch
	fmt.Println(base64.StdEncoding.EncodeToString(data))
}
```


# What this does

This allows provisioner daemons to download files from `coderd`'s `files` table. This is used to send over cached module files and prevent the need of downloading these modules on each workspace build.
This commit is contained in:
Steven Masley
2026-01-09 11:23:32 -06:00
committed by GitHub
parent 89f4d60e7b
commit d2044c2ee9
12 changed files with 841 additions and 467 deletions
@@ -1433,7 +1433,7 @@ UploadFileStream:
}
switch typed := msg.Type.(type) {
case *proto.UploadFileRequest_DataUpload:
case *sdkproto.FileUpload_DataUpload:
if file != nil {
return xerrors.New("unexpected file upload while waiting for file completion")
}
@@ -1453,7 +1453,7 @@ UploadFileStream:
// This should never really happen in practice, but we handle it gracefully.
break UploadFileStream
}
case *proto.UploadFileRequest_ChunkPiece:
case *sdkproto.FileUpload_ChunkPiece:
if file == nil {
return xerrors.New("unexpected chunk piece while waiting for file upload")
}
@@ -1518,6 +1518,11 @@ UploadFileStream:
return nil
}
func (*server) DownloadFile(_ *proto.FileRequest, _ proto.DRPCProvisionerDaemon_DownloadFileStream) error {
// TODO implemented in follow up PR
panic("implement me")
}
// CompleteJob is triggered by a provision daemon to mark a provisioner job as completed.
func (s *server) CompleteJob(ctx context.Context, completed *proto.CompletedJob) (*proto.Empty, error) {
ctx, span := s.startTrace(ctx, tracing.FuncName())
@@ -110,10 +110,10 @@ func TestUploadFileErrorScenarios(t *testing.T) {
stream := &mockUploadStream{
done: make(chan struct{}),
messages: make(chan *proto.UploadFileRequest, 2),
messages: make(chan *sdkproto.FileUpload, 2),
}
up := &proto.UploadFileRequest{Type: &proto.UploadFileRequest_DataUpload{DataUpload: upload}}
up := &sdkproto.FileUpload{Type: &sdkproto.FileUpload_DataUpload{DataUpload: upload}}
// Send it twice
stream.messages <- up
@@ -140,7 +140,7 @@ func TestUploadFileErrorScenarios(t *testing.T) {
type mockUploadStream struct {
done chan struct{}
messages chan *proto.UploadFileRequest
messages chan *sdkproto.FileUpload
}
func (m mockUploadStream) SendAndClose(empty *proto.Empty) error {
@@ -148,7 +148,7 @@ func (m mockUploadStream) SendAndClose(empty *proto.Empty) error {
return nil
}
func (m mockUploadStream) Recv() (*proto.UploadFileRequest, error) {
func (m mockUploadStream) Recv() (*sdkproto.FileUpload, error) {
msg, ok := <-m.messages
if !ok {
return nil, xerrors.New("no more messages to receive")
@@ -177,14 +177,14 @@ func (m *mockUploadStream) isDone() bool {
func newMockUploadStream(up *sdkproto.DataUpload, chunks ...*sdkproto.ChunkPiece) *mockUploadStream {
stream := &mockUploadStream{
done: make(chan struct{}),
messages: make(chan *proto.UploadFileRequest, 1+len(chunks)),
messages: make(chan *sdkproto.FileUpload, 1+len(chunks)),
}
if up != nil {
stream.messages <- &proto.UploadFileRequest{Type: &proto.UploadFileRequest_DataUpload{DataUpload: up}}
stream.messages <- &sdkproto.FileUpload{Type: &sdkproto.FileUpload_DataUpload{DataUpload: up}}
}
for _, chunk := range chunks {
stream.messages <- &proto.UploadFileRequest{Type: &proto.UploadFileRequest_ChunkPiece{ChunkPiece: chunk}}
stream.messages <- &sdkproto.FileUpload{Type: &sdkproto.FileUpload_ChunkPiece{ChunkPiece: chunk}}
}
close(stream.messages)
return stream