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

Skip to content

Commit a2340ff

Browse files
committed
tweak api a bit
1 parent 10d3bac commit a2340ff

File tree

3 files changed

+50
-21
lines changed

3 files changed

+50
-21
lines changed

coderd/files/overlay.go

+32-18
Original file line numberDiff line numberDiff line change
@@ -6,37 +6,51 @@ import (
66
"strings"
77
)
88

9-
type overlay struct {
10-
baseFS fs.FS
11-
overlayFS fs.FS
12-
overlayPath string
9+
// withModulesFS allows you to "join" together the template files tar file fs.FS
10+
// with the Terraform modules tar file fs.FS. We could potentially turn this
11+
// into something more parameterized/configurable, but the requirements here are
12+
// a _bit_ odd, because every file in the modulesFS includes the
13+
// .terraform/modules/ folder at the beginning of it's path.
14+
type overlayFS struct {
15+
baseFS fs.FS
16+
overlays []Overlay
1317
}
1418

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),
19+
type Overlay struct {
20+
Path string
21+
fs.FS
22+
}
23+
24+
func NewOverlayFS(baseFS fs.FS, overlays []Overlay) fs.FS {
25+
return overlayFS{
26+
baseFS: baseFS,
27+
overlays: overlays,
2028
}
2129
}
2230

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)
31+
func (f overlayFS) Open(p string) (fs.File, error) {
32+
for _, overlay := range f.overlays {
33+
if strings.HasPrefix(path.Clean(p), overlay.Path) {
34+
return overlay.FS.Open(p)
35+
}
2636
}
2737
return f.baseFS.Open(p)
2838
}
2939

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)
40+
func (f overlayFS) ReadDir(p string) ([]fs.DirEntry, error) {
41+
for _, overlay := range f.overlays {
42+
if strings.HasPrefix(path.Clean(p), overlay.Path) {
43+
return overlay.FS.(fs.ReadDirFS).ReadDir(p)
44+
}
3345
}
3446
return f.baseFS.(fs.ReadDirFS).ReadDir(p)
3547
}
3648

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)
49+
func (f overlayFS) ReadFile(p string) ([]byte, error) {
50+
for _, overlay := range f.overlays {
51+
if strings.HasPrefix(path.Clean(p), overlay.Path) {
52+
return overlay.FS.(fs.ReadFileFS).ReadFile(p)
53+
}
4054
}
4155
return f.baseFS.(fs.ReadFileFS).ReadFile(p)
4256
}

coderd/files/overlay_test.go

+17-2
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,32 @@ import (
99
"github.com/stretchr/testify/require"
1010
)
1111

12-
func TestWoohoo(t *testing.T) {
12+
func TestOverlayFS(t *testing.T) {
1313
a := afero.NewMemMapFs()
1414
afero.WriteFile(a, "main.tf", []byte("terraform {}"), 0o644)
15+
afero.WriteFile(a, ".terraform/modules/example_module/main.tf", []byte("inaccessible"), 0o644)
16+
afero.WriteFile(a, ".terraform/modules/other_module/main.tf", []byte("inaccessible"), 0o644)
1517
b := afero.NewMemMapFs()
1618
afero.WriteFile(b, ".terraform/modules/modules.json", []byte("{}"), 0o644)
17-
it := files.NewOverlayFS(afero.NewIOFS(a), afero.NewIOFS(b), ".terraform/modules")
19+
afero.WriteFile(b, ".terraform/modules/example_module/main.tf", []byte("terraform {}"), 0o644)
20+
21+
it := files.NewOverlayFS(afero.NewIOFS(a), []files.Overlay{{
22+
Path: ".terraform/modules",
23+
FS: afero.NewIOFS(b),
24+
}})
1825

1926
content, err := fs.ReadFile(it, "main.tf")
2027
require.NoError(t, err)
2128
require.Equal(t, "terraform {}", string(content))
29+
30+
_, err = fs.ReadFile(it, ".terraform/modules/other_module/main.tf")
31+
require.Error(t, err)
32+
2233
content, err = fs.ReadFile(it, ".terraform/modules/modules.json")
2334
require.NoError(t, err)
2435
require.Equal(t, "{}", string(content))
36+
37+
content, err = fs.ReadFile(it, ".terraform/modules/example_module/main.tf")
38+
require.NoError(t, err)
39+
require.Equal(t, "terraform {}", string(content))
2540
}

coderd/parameters.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ func (api *API) templateVersionDynamicParameters(rw http.ResponseWriter, r *http
9797
})
9898
return
9999
}
100-
templateFS = files.NewOverlayFS(templateFS, moduleFilesFS, ".terraform/modules")
100+
templateFS = files.NewOverlayFS(templateFS, []files.Overlay{{Path: ".terraform/modules", FS: moduleFilesFS}})
101101
}
102102
} else if !xerrors.Is(err, sql.ErrNoRows) {
103103
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{

0 commit comments

Comments
 (0)