Skip to content

Commit 1319ae2

Browse files
authored
chore: support zip filetypes in the file cache (#18750)
1 parent 79d1465 commit 1319ae2

File tree

4 files changed

+46
-9
lines changed

4 files changed

+46
-9
lines changed

coderd/coderdtest/coderdtest.go

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package coderdtest
22

33
import (
4+
"archive/tar"
45
"bytes"
56
"context"
67
"crypto"
@@ -52,6 +53,7 @@ import (
5253
"cdr.dev/slog"
5354
"cdr.dev/slog/sloggers/sloghuman"
5455
"cdr.dev/slog/sloggers/slogtest"
56+
"github.com/coder/coder/v2/archive"
5557
"github.com/coder/coder/v2/coderd/files"
5658
"github.com/coder/quartz"
5759

@@ -886,14 +888,22 @@ func createAnotherUserRetry(t testing.TB, client *codersdk.Client, organizationI
886888
return other, user
887889
}
888890

889-
// CreateTemplateVersion creates a template import provisioner job
890-
// with the responses provided. It uses the "echo" provisioner for compatibility
891-
// with testing.
892-
func CreateTemplateVersion(t testing.TB, client *codersdk.Client, organizationID uuid.UUID, res *echo.Responses, mutators ...func(*codersdk.CreateTemplateVersionRequest)) codersdk.TemplateVersion {
891+
func CreateTemplateVersionMimeType(t testing.TB, client *codersdk.Client, mimeType string, organizationID uuid.UUID, res *echo.Responses, mutators ...func(*codersdk.CreateTemplateVersionRequest)) codersdk.TemplateVersion {
893892
t.Helper()
894893
data, err := echo.TarWithOptions(context.Background(), client.Logger(), res)
895894
require.NoError(t, err)
896-
file, err := client.Upload(context.Background(), codersdk.ContentTypeTar, bytes.NewReader(data))
895+
896+
switch mimeType {
897+
case codersdk.ContentTypeTar:
898+
// do nothing
899+
case codersdk.ContentTypeZip:
900+
data, err = archive.CreateZipFromTar(tar.NewReader(bytes.NewBuffer(data)), int64(len(data)))
901+
require.NoError(t, err, "creating zip")
902+
default:
903+
t.Fatal("unexpected mime type", mimeType)
904+
}
905+
906+
file, err := client.Upload(context.Background(), mimeType, bytes.NewReader(data))
897907
require.NoError(t, err)
898908

899909
req := codersdk.CreateTemplateVersionRequest{
@@ -910,6 +920,13 @@ func CreateTemplateVersion(t testing.TB, client *codersdk.Client, organizationID
910920
return templateVersion
911921
}
912922

923+
// CreateTemplateVersion creates a template import provisioner job
924+
// with the responses provided. It uses the "echo" provisioner for compatibility
925+
// with testing.
926+
func CreateTemplateVersion(t testing.TB, client *codersdk.Client, organizationID uuid.UUID, res *echo.Responses, mutators ...func(*codersdk.CreateTemplateVersionRequest)) codersdk.TemplateVersion {
927+
return CreateTemplateVersionMimeType(t, client, codersdk.ContentTypeTar, organizationID, res, mutators...)
928+
}
929+
913930
// CreateWorkspaceBuild creates a workspace build for the given workspace and transition.
914931
func CreateWorkspaceBuild(
915932
t *testing.T,

coderd/coderdtest/dynamicparameters.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ type DynamicParameterTemplateParams struct {
2020
Plan json.RawMessage
2121
ModulesArchive []byte
2222

23+
// Uses a zip archive instead of a tar
24+
Zip bool
25+
2326
// StaticParams is used if the provisioner daemon version does not support dynamic parameters.
2427
StaticParams []*proto.RichParameter
2528

@@ -45,7 +48,11 @@ func DynamicParameterTemplate(t *testing.T, client *codersdk.Client, org uuid.UU
4548
},
4649
}}
4750

48-
version := CreateTemplateVersion(t, client, org, files, func(request *codersdk.CreateTemplateVersionRequest) {
51+
mime := codersdk.ContentTypeTar
52+
if args.Zip {
53+
mime = codersdk.ContentTypeZip
54+
}
55+
version := CreateTemplateVersionMimeType(t, client, mime, org, files, func(request *codersdk.CreateTemplateVersionRequest) {
4956
if args.TemplateID != uuid.Nil {
5057
request.TemplateID = args.TemplateID
5158
}

coderd/files/cache.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -303,10 +303,21 @@ func fetch(store database.Store, fileID uuid.UUID) (CacheEntryValue, error) {
303303
return CacheEntryValue{}, xerrors.Errorf("failed to read file from database: %w", err)
304304
}
305305

306-
content := bytes.NewBuffer(file.Data)
306+
var files fs.FS
307+
switch file.Mimetype {
308+
case "application/zip", "application/x-zip-compressed":
309+
files, err = archivefs.FromZipReader(bytes.NewReader(file.Data), int64(len(file.Data)))
310+
if err != nil {
311+
return CacheEntryValue{}, xerrors.Errorf("failed to read zip file: %w", err)
312+
}
313+
default:
314+
// Assume '"application/x-tar"' as the default mimetype.
315+
files = archivefs.FromTarReader(bytes.NewBuffer(file.Data))
316+
}
317+
307318
return CacheEntryValue{
308319
Object: file.RBACObject(),
309-
FS: archivefs.FromTarReader(content),
320+
FS: files,
310321
Size: int64(len(file.Data)),
311322
}, nil
312323
}

enterprise/coderd/workspaces_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,9 @@ func TestCreateUserWorkspace(t *testing.T) {
294294
OrganizationID: first.OrganizationID,
295295
})
296296

297-
template, _ := coderdtest.DynamicParameterTemplate(t, admin, first.OrganizationID, coderdtest.DynamicParameterTemplateParams{})
297+
template, _ := coderdtest.DynamicParameterTemplate(t, admin, first.OrganizationID, coderdtest.DynamicParameterTemplateParams{
298+
Zip: true,
299+
})
298300

299301
ctx = testutil.Context(t, testutil.WaitLong)
300302

0 commit comments

Comments
 (0)