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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy