Skip to content

Commit 560c8ce

Browse files
authored
fix: allow example files to be reused and not error (#5402)
1 parent 50d1c71 commit 560c8ce

File tree

2 files changed

+36
-9
lines changed

2 files changed

+36
-9
lines changed

coderd/templateversions.go

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -878,21 +878,39 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht
878878
// upload a copy of the template tar as a file in the database
879879
hashBytes := sha256.Sum256(tar)
880880
hash := hex.EncodeToString(hashBytes[:])
881-
file, err = api.Database.InsertFile(ctx, database.InsertFileParams{
882-
ID: uuid.New(),
881+
// Check if the file already exists.
882+
file, err := api.Database.GetFileByHashAndCreator(ctx, database.GetFileByHashAndCreatorParams{
883883
Hash: hash,
884884
CreatedBy: apiKey.UserID,
885-
CreatedAt: database.Now(),
886-
Mimetype: tarMimeType,
887-
Data: tar,
888885
})
889886
if err != nil {
890-
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
891-
Message: "Internal error creating file.",
892-
Detail: err.Error(),
887+
if !errors.Is(err, sql.ErrNoRows) {
888+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
889+
Message: "Internal error fetching file.",
890+
Detail: err.Error(),
891+
})
892+
return
893+
}
894+
895+
// If the example tar file doesn't exist, create it.
896+
file, err = api.Database.InsertFile(ctx, database.InsertFileParams{
897+
ID: uuid.New(),
898+
Hash: hash,
899+
CreatedBy: apiKey.UserID,
900+
CreatedAt: database.Now(),
901+
Mimetype: tarMimeType,
902+
Data: tar,
893903
})
894-
return
904+
if err != nil {
905+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
906+
Message: "Internal error creating file.",
907+
Detail: err.Error(),
908+
})
909+
return
910+
}
895911
}
912+
913+
req.FileID = file.ID
896914
}
897915

898916
if req.FileID != uuid.Nil {

coderd/templateversions_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,15 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) {
179179
tar, err := examples.Archive(ls[0].ID)
180180
require.NoError(t, err)
181181
require.EqualValues(t, tar, fl)
182+
183+
// ensure we don't get file conflicts on multiple uses of the same example
184+
tv, err = client.CreateTemplateVersion(ctx, user.OrganizationID, codersdk.CreateTemplateVersionRequest{
185+
Name: "my-example",
186+
StorageMethod: codersdk.ProvisionerStorageMethodFile,
187+
ExampleID: ls[0].ID,
188+
Provisioner: codersdk.ProvisionerTypeEcho,
189+
})
190+
require.NoError(t, err)
182191
})
183192
}
184193

0 commit comments

Comments
 (0)