Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d6ea303

Browse files
committed
overlay terraform modules on template files fs
1 parent 51cebae commit d6ea303

File tree

2 files changed

+59
-3
lines changed

2 files changed

+59
-3
lines changed

coderd/files/overlay.go

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package files
2+
3+
import (
4+
"io/fs"
5+
"path"
6+
"strings"
7+
)
8+
9+
type overlay struct {
10+
baseFS fs.FS
11+
overlayFS fs.FS
12+
overlayPath string
13+
}
14+
15+
func NewOverlayFS(baseFS, overlayFS fs.FS, overlayPath string) fs.FS {
16+
return overlay{
17+
baseFS: baseFS,
18+
overlayFS: overlayFS,
19+
overlayPath: path.Clean(overlayPath),
20+
}
21+
}
22+
23+
func (f overlay) Open(p string) (fs.File, error) {
24+
if strings.HasPrefix(path.Clean(p), f.overlayPath) {
25+
return f.overlayFS.Open(p)
26+
}
27+
return f.baseFS.Open(p)
28+
}
29+
30+
func (f overlay) ReadDir(p string) ([]fs.DirEntry, error) {
31+
if strings.HasPrefix(path.Clean(p), f.overlayPath) {
32+
return f.overlayFS.(fs.ReadDirFS).ReadDir(p)
33+
}
34+
return f.baseFS.(fs.ReadDirFS).ReadDir(p)
35+
}
36+
37+
func (f overlay) ReadFile(p string) ([]byte, error) {
38+
if strings.HasPrefix(path.Clean(p), f.overlayPath) {
39+
return f.overlayFS.(fs.ReadFileFS).ReadFile(p)
40+
}
41+
return f.baseFS.(fs.ReadFileFS).ReadFile(p)
42+
}

coderd/parameters.go

+17-3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
"github.com/coder/coder/v2/coderd/database"
1515
"github.com/coder/coder/v2/coderd/database/dbauthz"
16+
"github.com/coder/coder/v2/coderd/files"
1617
"github.com/coder/coder/v2/coderd/httpapi"
1718
"github.com/coder/coder/v2/coderd/httpmw"
1819
"github.com/coder/coder/v2/codersdk"
@@ -68,7 +69,7 @@ func (api *API) templateVersionDynamicParameters(rw http.ResponseWriter, r *http
6869
return
6970
}
7071

71-
fs, err := api.FileCache.Acquire(fileCtx, fileID)
72+
templateFS, err := api.FileCache.Acquire(fileCtx, fileID)
7273
defer api.FileCache.Release(fileID)
7374
if err != nil {
7475
httpapi.Write(ctx, rw, http.StatusNotFound, codersdk.Response{
@@ -85,6 +86,19 @@ func (api *API) templateVersionDynamicParameters(rw http.ResponseWriter, r *http
8586
tf, err := api.Database.GetTemplateVersionTerraformValues(ctx, templateVersion.ID)
8687
if err == nil {
8788
plan = tf.CachedPlan
89+
90+
if tf.CachedModuleFiles.Valid {
91+
moduleFilesFS, err := api.FileCache.Acquire(fileCtx, tf.CachedModuleFiles.UUID)
92+
defer api.FileCache.Release(tf.CachedModuleFiles.UUID)
93+
if err != nil {
94+
httpapi.Write(ctx, rw, http.StatusNotFound, codersdk.Response{
95+
Message: "Internal error fetching Terraform modules.",
96+
Detail: err.Error(),
97+
})
98+
return
99+
}
100+
templateFS = files.NewOverlayFS(templateFS, moduleFilesFS, ".terraform/modules")
101+
}
88102
} else if !xerrors.Is(err, sql.ErrNoRows) {
89103
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
90104
Message: "Failed to retrieve Terraform values for template version",
@@ -124,7 +138,7 @@ func (api *API) templateVersionDynamicParameters(rw http.ResponseWriter, r *http
124138
)
125139

126140
// Send an initial form state, computed without any user input.
127-
result, diagnostics := preview.Preview(ctx, input, fs)
141+
result, diagnostics := preview.Preview(ctx, input, templateFS)
128142
response := codersdk.DynamicParametersResponse{
129143
ID: -1,
130144
Diagnostics: previewtypes.Diagnostics(diagnostics),
@@ -152,7 +166,7 @@ func (api *API) templateVersionDynamicParameters(rw http.ResponseWriter, r *http
152166
return
153167
}
154168
input.ParameterValues = update.Inputs
155-
result, diagnostics := preview.Preview(ctx, input, fs)
169+
result, diagnostics := preview.Preview(ctx, input, templateFS)
156170
response := codersdk.DynamicParametersResponse{
157171
ID: update.ID,
158172
Diagnostics: previewtypes.Diagnostics(diagnostics),

0 commit comments

Comments
 (0)