From e149a332e68d065079aec1fdc2088d9d23ace5a6 Mon Sep 17 00:00:00 2001 From: Jonathon Anderson Date: Sun, 27 Jul 2025 01:38:33 -0600 Subject: [PATCH] Bugfix: cloning a site overlay when parent dir does not exist Signed-off-by: Jonathon Anderson --- CHANGELOG.md | 7 ++++--- internal/pkg/overlay/config.go | 4 ++-- internal/pkg/overlay/overlay.go | 2 +- internal/pkg/warewulfd/api/overlay_test.go | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89bd7f69..fd0657d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,14 +17,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Restore default idempotency of `PUT /api/nodes/{id}` - `DELETE /api/overlays/{name}?force=true` can delete overlays that are in use - -### Changed - - `warewulfd` overlay autobuild rebuilds overlays after node discovery. #1468 ### Fixed - Improved netplan support. #1873 +### Fixed + +- Fixed a bug when cloning an overlay to site when parent is missing + ## v4.6.2, 2025-07-09 ### Added diff --git a/internal/pkg/overlay/config.go b/internal/pkg/overlay/config.go index f48ee64f..7896f8db 100644 --- a/internal/pkg/overlay/config.go +++ b/internal/pkg/overlay/config.go @@ -68,8 +68,8 @@ func (overlay Overlay) CloneSiteOverlay() (siteOverlay Overlay, err error) { if siteOverlay.Exists() { return siteOverlay, fmt.Errorf("site overlay already exists: %s", siteOverlay.Name()) } - if !util.IsDir(filepath.Dir(overlay.Path())) { - if err := os.MkdirAll(filepath.Dir(overlay.Path()), 0o755); err != nil { + if !util.IsDir(filepath.Dir(siteOverlay.Path())) { + if err := os.MkdirAll(filepath.Dir(siteOverlay.Path()), 0o755); err != nil { return siteOverlay, err } } diff --git a/internal/pkg/overlay/overlay.go b/internal/pkg/overlay/overlay.go index 2e59840b..433b424a 100644 --- a/internal/pkg/overlay/overlay.go +++ b/internal/pkg/overlay/overlay.go @@ -330,7 +330,7 @@ func FindOverlays() (overlayList []string) { files = append(files, distfiles...) } if sitefiles, err := os.ReadDir(controller.Paths.SiteOverlaydir()); err != nil { - wwlog.Warn("error reading overalys from %s: %s", controller.Paths.SiteOverlaydir(), err) + wwlog.Warn("error reading overlays from %s: %s", controller.Paths.SiteOverlaydir(), err) } else { files = append(files, sitefiles...) } diff --git a/internal/pkg/warewulfd/api/overlay_test.go b/internal/pkg/warewulfd/api/overlay_test.go index 62cb15c8..8fb03e07 100644 --- a/internal/pkg/warewulfd/api/overlay_test.go +++ b/internal/pkg/warewulfd/api/overlay_test.go @@ -103,7 +103,7 @@ func TestOverlayAPI(t *testing.T) { assert.NoError(t, err) assert.NoError(t, resp.Body.Close()) - assert.JSONEq(t, `{"files":["/email.ww"], "site":false}`, string(body)) + assert.JSONEq(t, `{"files":["/email.ww"], "site":true}`, string(body)) // get again req, err = http.NewRequest(http.MethodGet, srv.URL+"/api/overlays/testoverlay/file?path=email.ww", nil) @@ -155,7 +155,7 @@ func TestOverlayAPI(t *testing.T) { assert.NoError(t, err) assert.NoError(t, resp.Body.Close()) - assert.JSONEq(t, `{"test":{"files":null, "site":true},"testoverlay":{"files":["/email.ww"], "site":false}}`, string(body)) + assert.JSONEq(t, `{"test":{"files":null, "site":true},"testoverlay":{"files":["/email.ww"], "site":true}}`, string(body)) }) t.Run("test delete overlay file", func(t *testing.T) {